假设我们有这个表达式:
#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)
并检查结果以验证宏的扩展方式.