我的预处理器工作原理的心理模型显然不完整,这使我疯狂。预处理器令牌扩展
我想连接两个标记,但第一个标记应该先展开。
#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
。目前,这对我来说似乎很神奇。
任何人都可以向我解释这种行为?扩展规则如何正确工作?
我很抱歉地说,我还提出了同样问题的可能重复的问题。我想知道为什么这种行为没有明确记录。我的意思是预处理器运行的算法。 – 2013-05-16 20:57:22
@sandundhammika:它在规范中有相当清楚的记载 - 第6.10.3节 - 虽然有一些未定义的行为角落。 – 2015-04-18 19:14:38