我认为用一个例子可以更好地说明。使用这样的结构:
typedef struct {
int a;
char b;
} Foo;
定义一个宏:
#define Foo(A, B) (Foo){ A, B }
然后可以这样使用:
Foo foo;
foo = Foo(1, 'c');
我已经使用过这种模式一段时间了,对我而言,它是一种非常优雅的初始化结构的方式。它适用于GCC和Clang(以及我认为的TCC),但在一些鲜为人知的C编译器(如Plan 9&#C; C编译器)中,它没有。
C标准对该主题有何规定?
答案 0 :(得分:7)
摘自C11标准§6.10.3.10:
类似函数的宏名称的每个后续实例后跟 (作为下一个预处理令牌引入了序列 预处理令牌,由替换列表替换 定义(调用宏)。
所以,不,你不应该担心。只有当宏名称后跟一个左括号(。
)时,才会替换类似函数的宏答案 1 :(得分:2)
预处理器进行文本替换,它对C语言一无所知。因此,它不关心C标识符。
所以,不,宏不能与标识符冲突。