首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:正在粘贴“。并且"red“不提供有效的预处理标记。

错误:正在粘贴“。并且"red“不提供有效的预处理标记。
EN

Stack Overflow用户
提问于 2012-11-04 13:55:32
回答 1查看 39.5K关注 0票数 46

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

宏X-list的定义如下:

代码语言:javascript
复制
#define LIST \
  X(red, "red") \
  X(blue, "blue") \
  X(yellow, "yellow")

然后:

代码语言:javascript
复制
#define X(a, b) foo.##a = -1;
  LIST;
#undef X

但gcc给出了以下错误信息:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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()?”这不是我真正的代码。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-04 13:59:48

.分隔令牌,因此您不能使用##,因为.red不是有效的令牌。只有在将两个令牌连接成一个令牌时,才会使用##

这是可行的:

代码语言:javascript
复制
#define X(a, b) foo.a = -1;

什么是有效的预处理标记?有人能解释一下吗?

它就是被解析/词法分析的内容。foo.bar将被解析为3个令牌(两个标识符和一个运算符):foo . bar如果使用##,您将只获得两个令牌(一个标识符和一个无效令牌):foo .bar

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13216423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档