为宏函数的参数添加括号

为宏函数的参数添加括号

为宏函数的参数添加括号 #

下面这个例子:

#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 函数时所期望的。而通过为宏函数定义中的每个参数都加上括号,我们便可以解决这个问题。

Viewpoint #

From #

09|编译准备:预处理器是怎样处理程序代码的?