您需要在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
),那么它会被第一取代。您可避免通过后缀宏观去除##
的间接:
#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
也是一个宏,那么你有一个问题,因为在连接它们之前没有扩展一个令牌的好方法。
[C预处理器和串联]的可能重复(http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation) – 2013-05-13 23:17:26