Macro 作为 C 语言中宏的参数

Macro as an argument to a macro in C

提问人:kharevbv 提问时间:2/17/2014 最后编辑:kharevbv 更新时间:2/17/2014 访问量:154

问:

我想知道在以下代码中首先替换哪个宏

#define A 100
#define B 200
#define C(A,B) A+B

当我们使用 C 时,评估将从左到右或从右到左。也就是说,B 先获取值或 A 先获取值

我举这个例子只是为了让事情看起来很简单,可能是我错了。我真正想问的是,如果 A 和 B 也接受论证并具有扩展范围,那么哪一个会先扩展

C

评论

0赞 Ed Heal 2/17/2014
只需将宏用于简单的事情 - 使用编译器进行更复杂的事情。它有一个类型安全。尽量避免使用宏
1赞 WhozCraig 2/17/2014
我不是唯一一个盯着这个想法的人认为 A 和 B 宏都是无关紧要的。(并不是说我在预处理器世界中生活和死亡,但仍然......
0赞 Jens Gustedt 2/17/2014
没有什么可以替换的,因为你不评估任何东西。
0赞 Ed Heal 2/17/2014
@WhozCraig - 你不是唯一一个
1赞 vgru 2/17/2014
A在类似函数的宏中是宏参数。它们与 和 定义没有任何关系。BCAB

答:

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 + 2AB

当然,我必须说,我发现上述做法非常糟糕,因为它非常令人困惑。切勿对宏参数使用全大写名称,因为宏和预处理器符号倾向于使用此类名称。

评论

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,可以肯定的是,评估的顺序是不确定的。我现在没有消息来源来支持我,但我非常确定这是真的。