【发布时间】:2017-06-01 04:00:30
【问题描述】:
我尝试使用串联预处理器运算符## 来理解 c 中的宏,但我意识到我在使用标记时遇到了问题。我认为这很容易,但实际上并非如此。
所以连接是为了连接两个令牌以创建一个新令牌。
例如:连接 ( 和 ) 或 int 和 *
我试过了
#define foo(x,y) x ## y
foo(x,y)
每当我给它一些论点时,我总是会出错,说pasting both argument does not give a valid preprocessor token.
例如为什么连接foo(1,aa) 会导致1aa(它是哪种类型的令牌?为什么它是有效的)但是foo(int,*) 我得到了一个错误。
有没有办法知道哪些令牌是有效的,或者是否有可能有一些好的链接来理解如何在我的脑海中澄清它。 (我已经在 google 和 SO 中搜索过)
我错过了什么?
我将不胜感激。
【问题讨论】:
-
请求链接是题外话。如果您确实展示了导致该错误传递的内容,您可能会获得帮助。
-
我认为
1aa不是有效的预处理令牌 -
它不属于任何 6 种令牌类型,但 gcc 什么也没说,甚至没有警告?
-
@mm:
1aa是一个preprocessing number;它是预处理器的有效令牌。 (一个 pp-number 可以在数字之后有任何标识符字符序列,这从标准的词汇语法中可以看出。)
标签: c gcc macros c-preprocessor