以下宏可能给应用程序带来哪些问题?

以下宏可以带来问题吗?

#define sq(x) x*x 

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

是的,它可能会带来问题。 除了明显的事实,即宏根本不尊重命名空间(这意味着你不能调用任何其他sq ),请尝试以下方法:

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

你应该用括号括起x * x ,使它成为((x) * (x))

另一个问题:

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

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

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

 #include  #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)); } 

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

编写宏时使用括号过多。 重写宏如下

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

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

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

正如所指出的,你应该在括号中包含参数的每次使用以确保正确的行为,例如,当参数类似于i * 2

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

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

 result = sq(++i); 

这被翻译为:

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

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

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

所有这些都可能导致麻烦:

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

比较functionsq

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

 sq(2+2); // author wants 4*4, but gets 2+2*2+2.