为什么需要间接

时间:2016-05-08 12:02:44

标签: c++ c-preprocessor

考虑以下宏:

#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不会展开。为什么会出现这种情况以及间接有何帮助?

2 个答案:

答案 0 :(得分:5)

##是字符串连接符,因此如果您从CAT(Logging, SLB_ALGORITHM)宏调用SLB_LOGGING_ALGORITHM,则会导致字符串Logging与字符串SLB_ALGORITHM串联,那就是:LoggingSLB_ALGORITHM这可能不是你想要的。

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

答案 1 :(得分:2)

引用this answer

  

当您进行宏替换时,如果字符串化运算符#和标记粘贴运算符##都不应用于预处理器,则预处理器将仅递归扩展宏。

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