【发布时间】:2011-05-16 03:29:06
【问题描述】:
我对预处理器如何工作的心智模型显然不完整,这让我发疯。
我想连接两个标记,但第二个标记应该先展开。
#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。目前,这对我来说似乎很神奇。
谁能向我解释这种行为?扩展规则究竟是如何工作的?
【问题讨论】:
-
很抱歉,我也对同一问题提出了可能重复的问题。我想知道为什么没有清楚地记录这种行为。我的意思是预处理器运行的算法。
-
@sandundhammika:规范中非常清楚地记录了它——第 6.10.3 节——尽管有许多未定义的行为角。
标签: c++ c c-preprocessor