为什么需要间接

Why is the indirection needed

本文关键字:为什么      更新时间:2023-10-16

请考虑以下宏:

#define CAT(X, Y) X ## Y
#define CMB(A, B) CAT(A, B)
#define SLB_LOGGING_ALGORITHM CMB(Logging, SLB_ALGORITHM)

其中SLB_ALGORITHM是定义的预处理器符号。

如果我只是直接使用CAT而不是CMBSLB_ALGORITHM不会扩展。为什么会这样,间接寻址究竟如何提供帮助?

##是一个字符串连接器,所以如果你从SLB_LOGGING_ALGORITHM宏调用CAT(Logging, SLB_ALGORITHM),这将导致字符串Logging与字符串SLB_ALGORITHM的串联,即:LoggingSLB_ALGORITHM这可能不是你想要的。

相反,从宏调用CMB(Logging, SLB_ALGORITHM)SLB_LOGGING_ALGORITHM预处理器首先扩展LoggingSLB_ALGORITHM(调用CMB()(,然后连接扩展的字符串(调用CAT()(。

引用这个答案:

当您有宏替换时,预处理器将仅在字符串化运算符 # 和标记粘贴运算符 ## 未应用于宏的情况下递归扩展宏。

因此,预处理器在对给定宏应用##时不会对其进行扩展。这就是为什么它在CMB(A, B)级别中被附加而不是在直接使用CAT(X, Y)时不被附加的原因。