错误:粘贴"。"和"红色"不提供有效的预处理令牌

时间:2012-11-04 05:55:32

标签: c macros c-preprocessor

我正在实现X宏,但我有一个简单的宏扩展问题。通过在this文章中加入,该宏(见下文)用于几个宏用法示例。  编译器给出了一条错误消息,但我可以通过在GCC编译器中使用-E标志来查看有效的C代码。

宏X列表定义如下:

#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

就像我说的,我可以通过使用-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;;

什么是有效的预处理令牌?有人可以解释一下吗?

(在您说“为什么不只是初始化或memset()?”之前,这不是我真正的代码。)

1 个答案:

答案 0 :(得分:43)

.会分隔令牌,因此您无法使用##,因为.red不是有效令牌。如果您将两个令牌连接成一个令牌,则只能使用##

这有效:

#define X(a, b) foo.a = -1;
  

什么是有效的预处理令牌?有人可以解释一下吗?

这是解析/ lexed的内容。 foo.bar将被解析为3个令牌(两个标识符和一个运算符):foo . bar如果使用##,则只能获得2个令牌(一个标识符和一个无效令牌):{{1 }}