为宏函数的参数添加括号 #
下面这个例子:
#include <stdio.h>
#define FOO(x) (1 + x * x)
int main(void) {
printf("%d", FOO(1 + 2));
return 0;
}
我们直接将表达式 1 + 2 作为参数传递给FOO函数。由于编译器在处理宏函数时,仅会进行实参在各自位置上的文本替换,传入函数的表达式并不会在函数展开前进行求值。因此,经过编译器的预处理后,上述代码中第四行对 printf 语句的调用过程会被变更为如下形式:
printf("%d", (1 + 1 + 2 * 1 + 2));
由于乘法运算符 “*” 的存在,此时整个表达式的求值顺序发生了改变。本该被优先求值的子表达式 1 + 2 并没有被提前计算。
很明显,这并不是我们在设计 FOO 函数时所期望的。而通过为宏函数定义中的每个参数都加上括号,我们便可以解决这个问题。