为什么需要间接

Alw*_*ing 5 c++ c-preprocessor

考虑以下宏:

#define CAT(X, Y) X ## Y
#define CMB(A, B) CAT(A, B)
#define SLB_LOGGING_ALGORITHM CMB(Logging, SLB_ALGORITHM)
Run Code Online (Sandbox Code Playgroud)

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

如果我只是用CAT,而不是直接的CMB,SLB_ALGORITHM没有得到扩大.为什么这种情况以及间接有何帮助?

shr*_*ike 5

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

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


Tom*_*mer 2

引用这个答案

当您进行宏替换时,如果既没有应用字符串化运算符 # 也没有应用标记粘贴运算符 ##,预处理器只会递归地扩展宏。

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