提问人:kharevbv 提问时间:2/17/2014 最后编辑:kharevbv 更新时间:2/17/2014 访问量:154
Macro 作为 C 语言中宏的参数
Macro as an argument to a macro in C
问:
我想知道在以下代码中首先替换哪个宏
#define A 100
#define B 200
#define C(A,B) A+B
当我们使用 C 时,评估将从左到右或从右到左。也就是说,B 先获取值或 A 先获取值
我举这个例子只是为了让事情看起来很简单,可能是我错了。我真正想问的是,如果 A 和 B 也接受论证并具有扩展范围,那么哪一个会先扩展
答:
3赞
unwind
2/17/2014
#1
我不确定你的意思。从来没有一个点可以“看到”预处理器的一半结果;整个输入文件经过预处理,然后移交给编译器。
我认为宏参数的名称永远不会被替换,就好像它们是独立的符号一样。
我试过了,这个程序:
#include <stdio.h>
#define A 100
#define B 200
#define C(A, B) A + B
int main(void) {
printf("A=%d\nB=%d\nC(1,2)=%d\n", A, B, C(1,2));
return 0;
}
指纹
A=100
B=200
C(1,2)=3
所以,扩展到 ,和 的定义无关紧要。C(1,2)
1 + 2
A
B
当然,我必须说,我发现上述做法非常糟糕,因为它非常令人困惑。切勿对宏参数使用全大写名称,因为宏和预处理器符号倾向于使用此类名称。
评论
0赞
WhozCraig
2/17/2014
+1 本片的最后一段应该教到从破碎的睡眠中背诵为止。
0赞
Jens Gustedt
2/17/2014
我不认为这是“坏”的做法,或者说比将任何函数或宏参数与另一个符号命名相同更糟糕。与所有大写名称无关。
0赞
kharevbv
2/17/2014
我举这个例子只是为了让事情看起来很简单,可能是我错了。我真正想问的是,如果 A 和 B 也接受论证并具有扩展范围,那么哪一个会先扩展
0赞
unwind
2/17/2014
@kharevbv 我认为你也许应该发布一个新问题,它确实包含你想问的问题。
1赞
tangrs
2/17/2014
@kharevbv,可以肯定的是,评估的顺序是不确定的。我现在没有消息来源来支持我,但我非常确定这是真的。
评论
A
在类似函数的宏中是宏参数。它们与 和 定义没有任何关系。B
C
A
B