为什么需要间接寻址

Why is the indirection needed

考虑以下宏:

#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 与字符串 [=14= 的连接],即:LoggingSLB_ALGORITHM 这可能不是您想要的。

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

引用this answer:

When you have a macro replacement, the preprocessor will only expand the macros recursively if neither the stringizing operator # nor the token-pasting operator ## are applied to it.

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