根据C标准,带参数的宏可能会与标识符冲突吗?

时间:2018-06-10 20:28:54

标签: c

我认为用一个例子可以更好地说明。使用这样的结构:

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标准对该主题有何规定?

2 个答案:

答案 0 :(得分:7)

摘自C11标准§6.10.3.10:

  

类似函数的宏名称的每个后续实例后跟   (作为下一个预处理令牌引入了序列   预处理令牌,由替换列表替换   定义(调用宏)。

所以,不,你不应该担心。只有当宏名称后跟一个左括号(。

)时,才会替换类似函数的宏

答案 1 :(得分:2)

预处理器进行文本替换,它对C语言一无所知。因此,它不关心C标识符。

所以,不,宏不能与标识符冲突。