以下宏可能会给应用程序带来什么问题

What problems might the following macro bring to the application?

本文关键字:应用程序 什么 问题      更新时间:2023-10-16

下面的宏会带来问题吗?

#define sq(x) x*x

如果是,那么如何以及为什么?请帮助。

是的,它可能会出现问题。除了宏根本不尊重命名空间的明显事实(这意味着您不能sq调用任何其他内容)之外,请尝试以下操作:

int result = sq(4) / sq(4);

您应该用括号将x * x括起来,使其变得((x) * (x))

另一个问题:

int a = 0;
int result = sq(++a);

这是宏固有的问题,也是应该首选内联函数的原因之一。

我不会给你一个直接的答案(这看起来像一个家庭作业问题),但我会给你一个例子,希望能让你思考并提出一个正确的答案:

#include <iostream>
#define sq_macro(x) x * x
int sq_function(int x)
{
    return x * x;
}
int print_and_ret(int x)
{
    std::cout << x << 'n';
    return x;
}
int main()
{
    std::cout << "Calling sq_macro:n";
    sq_macro(print_and_ret(10));
    std::cout << "Calling sq_function:n";
    sq_function(print_and_ret(10));
}

运行程序时,宏和函数会提供两种不同的行为。想想什么是宏,什么是函数。

在编写宏时,过度使用括号。重写宏,如下所示

#define sq(x) ((x)*(x))

如果不这样做,那么在将宏用作sq(5+4)的情况下,您将遇到问题

要了解问题,请进行宏扩展并查看。

如前所述,您应该将参数的每次使用都括在括号中以确保正确的行为,例如,当参数类似于 i * 2 时:

#define sq(x) ((x)*(x))

但还有另一个潜在的问题。请考虑以下事项:

result = sq(++i);

这被翻译成:

result = ((++i)*(++i))

如果意图可能只增加一次i,它会增加两次。这是宏的常见副作用。

一种方法是在调用它时意识到这一点,但更好的方法是将sq()放在它自己的内联函数中。

所有这些都可能造成麻烦:

int x = 12;
int n = sq(x+3);
int y = sq(x++);
int z = 2 * sq(2 + n) * n;

与函数sq进行比较。

首先,运算符优先级会被搞砸:

sq(2+2); // author wants 4*4, but gets 2+2*2+2. 
相关文章: