为什么需要间接寻址
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
而不是 CMB
,SLB_ALGORITHM
不会展开。为什么会这样?间接寻址究竟有何帮助?
##
是一个字符串连接符,因此如果您从 SLB_LOGGING_ALGORITHM
宏调用 CAT(Logging, SLB_ALGORITHM)
,这将导致字符串 Logging
与字符串 [=14= 的连接],即:LoggingSLB_ALGORITHM
这可能不是您想要的。
当从 SLB_LOGGING_ALGORITHM
宏调用 CMB(Logging, SLB_ALGORITHM)
时,预处理器首先扩展 Logging
和 SLB_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)
时没有扩展的原因。
考虑以下宏:
#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
不会展开。为什么会这样?间接寻址究竟有何帮助?
##
是一个字符串连接符,因此如果您从 SLB_LOGGING_ALGORITHM
宏调用 CAT(Logging, SLB_ALGORITHM)
,这将导致字符串 Logging
与字符串 [=14= 的连接],即:LoggingSLB_ALGORITHM
这可能不是您想要的。
当从 SLB_LOGGING_ALGORITHM
宏调用 CMB(Logging, SLB_ALGORITHM)
时,预处理器首先扩展 Logging
和 SLB_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)
时没有扩展的原因。