考虑以下宏:
#define CAT(X, Y) X ## Y
#define CMB(A, B) CAT(A, B)
#define SLB_LOGGING_ALGORITHM CMB(Logging, SLB_ALGORITHM)
其中SLB_ALGORITHM
是定义的预处理器符号。
如果我直接使用CAT
代替CMB
,则SLB_ALGORITHM
不会展开。为什么会出现这种情况以及间接有何帮助?
答案 0 :(得分:5)
##
是字符串连接符,因此如果您从CAT(Logging, SLB_ALGORITHM)
宏调用SLB_LOGGING_ALGORITHM
,则会导致字符串Logging
与字符串SLB_ALGORITHM
串联,那就是:LoggingSLB_ALGORITHM
这可能不是你想要的。
从CMB(Logging, SLB_ALGORITHM)
宏调用SLB_LOGGING_ALGORITHM
时,预处理器首先展开Logging
和SLB_ALGORITHM
(调用CMB()
)然后连接扩展字符串(调用到CAT()
)。
答案 1 :(得分:2)
引用this answer:
当您进行宏替换时,如果字符串化运算符#和标记粘贴运算符##都不应用于预处理器,则预处理器将仅递归扩展宏。
因此,当应用##
时,预处理器不会扩展给定的宏。这就是为什么它在CMB(A, B)
级别中被扩展,而在直接使用CAT(X, Y)
时却没有。