代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

预处理器令牌扩展[重复]

  •  14
  • fredoverflow  · 技术社区  · 15 年前

    我对预处理器工作方式的心理模型显然是不完整的,这让我抓狂。

    我想连接两个令牌,但第二个令牌应该首先展开。

    #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 . 现在,这对我来说像是魔法。

    有人能给我解释一下这种行为吗?扩展规则究竟是如何工作的?

    2 回复  |  直到 11 年前
        1
  •  8
  •   Community Mohan Dere    9 年前

    读一下你问题的答案 here :

    问题是当你有 宏替换,预处理器 只会展开宏 递归地,如果 操作员或标记粘贴 运算符应用于它。所以,你 必须使用一些额外的层 间接的,你可以使用 带有 递归展开参数

        2
  •  3
  •   Ziffusion    15 年前

    执行连接时,标记连接不展开宏 [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