【问题标题】:Macro concatenation, function name generation宏连接,函数名生成
【发布时间】:2013-03-09 11:06:34
【问题描述】:
#define Map(From, To, val)          \
        Map__##From__##To(val)


Map(TYPEA, TYPEB, 22);

在上面的代码中,我想知道为什么 Map(TYPEA, TYPEB, 22); 扩展到 Map__From__TYPEB(22); 而不是 Map__TYPEA__TYPEB(22);

我使用 gcc -E 进行扩展。

【问题讨论】:

    标签: c macros concatenation c-preprocessor


    【解决方案1】:
    "#define ZERO 0" != "#define ZERO 0_"
    

    同样,在您的 sn-p 中,From != From_ 因此不会被替换。 @Aniket 已经提供了有效的解决方案。

    【讨论】:

      【解决方案2】:

      因为From__ 不是Map 中的标记,因此预处理器不会查找它。修复方法是:

      #define Map(From, To, val) \
              Map__##From##__##To(val)
      

      【讨论】:

      • 它工作正常,但我还不明白原因,你能指出一些可以解释 ##From## 和 ##From 之间差异的文献吗?
      • 它是关于理解@LOK 的基本原理,它很简单——From 是一个可以被替换的令牌。其中From__ 不是一个可以被替换的令牌。可替换的标记在括号中。
      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      相关资源
      最近更新 更多