2010-11-26 68 views
13

我的预处理器工作原理的心理模型显然不完整,这使我疯狂。预处理器令牌扩展

我想连接两个标记,但第一个标记应该先展开。

#define ANSWER 42 

#define FOO foo_ ## ANSWER 

这里,FOO扩展为foo_ANSWER,但我希望它是foo_42。所以,我在希望,这会在一定程度连接前扩大参数定义MERGE宏:

#define MERGE(x, y) x ## y 

#define BAR MERGE(bar_, ANSWER) 

BAR还扩展到bar_ANSWER,而不是bar_42。所以我定义另一个宏HELPER

#define HELPER(x, y) MERGE(x, y) 

#define BAZ HELPER(baz_, ANSWER) 

现在BAZ成功地扩展到baz_42。目前,这对我来说似乎很神奇。

任何人都可以向我解释这种行为?扩展规则如何正确工作?

+0

我很抱歉地说,我还提出了同样问题的可能重复的问题。我想知道为什么这种行为没有明确记录。我的意思是预处理器运行的算法。 – 2013-05-16 20:57:22

+0

@sandundhammika:它在规范中有相当清楚的记载 - 第6.10.3节 - 虽然有一些未定义的行为角落。 – 2015-04-18 19:14:38

回答

7

阅读回答你的问题here

的问题是,当你有一个 宏替换,预处理 将不仅扩大了宏 递归如果既字符串化 操作#也不令牌-opesting operator ##应用于它。所以,你 必须使用 间接的一些额外的图层,可以使用 标记粘贴的操作与 递归扩展参数

3

令牌级联串接执行时[ref]不展开宏。

为了克服这个问题,您需要使用间接级别,并让预处理器在连接之前展开宏。

#define STEP1(x, y) STEP2(x, y) // x and y will be expanded before the call to STEP2 
#define STEP2(x, y) x ## y   // x and y will not be expanded, just pasted