我正在实现X宏,但我在进行简单的宏扩展时遇到了问题。通过包含在this文章中,这个宏(见下文)被用于几个宏的用法示例。编译器给出了一个错误消息,但是我可以通过在GCC编译器中使用-E标志来看到有效的C代码。
宏X-list的定义如下:
#define LIST \
X(red, "red") \
X(blue, "blue") \
X(yellow, "yellow")然后:
#define X(a, b) foo.##a = -1;
LIST;
#undef X但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就像我说的,我可以通过在gcc上使用-E开关来看到有效的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;;什么是有效的预处理令牌?有人能解释一下吗?
(在您说“为什么不只使用initialize或memset()?”这不是我真正的代码。)
发布于 2012-11-04 13:59:48
.分隔令牌,因此您不能使用##,因为.red不是有效的令牌。只有在将两个令牌连接成一个令牌时,才会使用##。
这是可行的:
#define X(a, b) foo.a = -1;什么是有效的预处理标记?有人能解释一下吗?
它就是被解析/词法分析的内容。foo.bar将被解析为3个令牌(两个标识符和一个运算符):foo . bar如果使用##,您将只获得两个令牌(一个标识符和一个无效令牌):foo .bar
https://stackoverflow.com/questions/13216423
复制相似问题