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没有得到扩大.为什么这种情况以及间接有何帮助?
##是一个字符串连接器,所以如果你CAT(Logging, SLB_ALGORITHM)从SLB_LOGGING_ALGORITHM宏调用,这将导致字符串Logging与字符串串联SLB_ALGORITHM,即:LoggingSLB_ALGORITHM这可能不是你想要的.
CMB(Logging, SLB_ALGORITHM)从SLB_LOGGING_ALGORITHM宏调用时,预处理器首先展开Logging并SLB_ALGORITHM(调用CMB())然后连接扩展的字符串(调用CAT()).