您需要在 VAR_SUF 宏中进行额外的间接操作,以强制它在连接标记而不是先连接之前评估调用的宏:
#define A_T_SUF _a
#define B_t_SUF _b
#define SUFFIX(t) t ## _SUF
#define CAT(a, b) a ## b
#define XCAT(a, b) CAT(a, b)
#define VAR_SUF(var, t) XCAT(var, SUFFIX(t))
.....
VAR_SUF(x, A_T) ---> be replaced to x_a
没有额外的间接,VAR_SUF(x, A_T)
将扩展为xSUFFIX(A_T)
(首先连接,然后查找更多宏)。使用额外的 CAT/XCAT 间接,它将先扩展SUFFIX(A_T)
然后连接。
XCAT
是 的缩写EXPAND_AND_CONCATENATE
,而CAT
只是CONCATENATE
(没有扩展。)
编辑
如果A_T
也是一个宏(例如,#define A_T 1
),那么它将首先被替换。您可以通过删除##
SUFFIX 宏中的间接性来避免这种情况:
#define A_T_SUF _a
#define B_t_SUF _b
#define CAT(a, b) a ## b
#define XCAT(a, b) CAT(a, b)
#define VAR_SUF(var, t) XCAT(var, t##_SUF)
.....
VAR_SUF(x, A_T) ---> be replaced to x_a
这将导致该连接首先发生,然后宏将被扩展,然后另一个连接将发生
如果x
也是一个宏,那么您就有问题了,因为在连接它们之前没有扩展一个令牌而不是另一个令牌的好方法。