Jac*_*ack 37 c macros c-preprocessor
我正在实现X宏,但我有一个简单的宏扩展问题.通过在this
文章中包含,该宏(见下文)用于几个宏用法示例.编译器给出了一条错误消息,但我可以通过使用-E
带有GCC编译器的标志来查看有效的C代码.
宏X列表定义如下:
#define LIST \
X(red, "red") \
X(blue, "blue") \
X(yellow, "yellow")
Run Code Online (Sandbox Code Playgroud)
然后:
#define X(a, b) foo.##a = -1;
LIST;
#undef X
Run Code Online (Sandbox Code Playgroud)
但是gcc给出了以下错误消息:
lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
Run Code Online (Sandbox Code Playgroud)
就像我说的,我可以通过使用-E
gcc上的开关看到有效的C代码:
lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
foo.red = -1; foo.blue = -1; foo.yellow = -1;;
Run Code Online (Sandbox Code Playgroud)
什么是有效的预处理令牌?有人可以解释一下吗?
(在你说"为什么不只是初始化或memset()
?"之前,这不是我的真实代码.)
Pub*_*bby 47
.
分隔标记,因此您不能使用,##
因为.red
它不是有效的标记.只有##
在将两个令牌连接成一个令牌时才会使用.
这有效:
#define X(a, b) foo.a = -1;
Run Code Online (Sandbox Code Playgroud)
什么是有效的预处理令牌?有人可以解释一下吗?
它是解析/ lexed的东西.foo.bar
将被解析为3个令牌(两个标识符和一个运算符):foo . bar
如果您使用,##
您将只获得2个令牌(一个标识符和一个无效令牌):foo .bar