我对预处理器如何工作的心理模型显然是不完整的,这让我发疯了。
我想连接两个标记,但第二个标记应该首先扩展。
#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 :(得分:8)
阅读问题here的答案:
问题是当你有一个 宏替换,预处理器 只会扩展宏 如果没有字符串化,则递归递归 operator#也不是令牌粘贴 运算符##适用于它。那么你 必须使用一些额外的层 间接,你可以使用 带有一个令牌粘贴操作符 递归扩展参数
答案 1 :(得分: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