C++定义表达式评估

tom*_*mab -1 c++

假设我们有这个表达式:

#define cube(x) x * x * x
Run Code Online (Sandbox Code Playgroud)

然后我们称之为:

int n = 3, v;
v = cube(n + 1);   // v = 10
v = cube((n + 1)); // v = 64
v = cube(n);       // v = 27
Run Code Online (Sandbox Code Playgroud)

所以问题是:为什么第一次操作不做v = 64

Iha*_*imi 12

不评估宏(评估的通用解释的意义上),它们在编译时扩展.

在编译文件之前,还有另一个名为C预处理器的程序,它以字面/文本方式替换宏调用并准备文件以进行实际编译,因此对于您的宏

#define cube(x) x * x * x when you do this
Run Code Online (Sandbox Code Playgroud)

这个

v = cube(n + 1);
Run Code Online (Sandbox Code Playgroud)

被替换为此(expaned是正确的术语)

v = n + 1 * n + 1 * n + 1;
// Simplifies to
v = n + n + n + 1;
// and again
v = 3 * n + 1;
Run Code Online (Sandbox Code Playgroud)

这为n = 3您提供了10完整的观察结果.

请注意,添加括号时

v = cube((n + 1));
Run Code Online (Sandbox Code Playgroud)

然后,扩张是

v = (n + 1) * (n + 1) * (n + 1);
Run Code Online (Sandbox Code Playgroud)

这是你期望cube()做的,所以要防止这种情况你应该像这样重新定义你的宏

#define cube(x) ((x) * (x) * (x))
Run Code Online (Sandbox Code Playgroud)

如果你正在使用gcc试试

gcc -E source.c
Run Code Online (Sandbox Code Playgroud)

并检查结果以验证宏的扩展方式.

  • @tomab,这是纯文本替换,如果你试图用带有副作用的东西扩展宏,这会让你感到惊讶. (3认同)