我有
#define A_T 1
#define B_T 2
int x_a = 1, x_b =2;
如何定义一个宏,它可以将后缀_a和_b连接到var名称?
for example, something like this
#define A_T_SUF _a
#define B_t_SUF _b
#define SUFFIX(t) t ## _SUF
#define VAR_SUF(var, t) var ## SUFFIX(t)
.....
VAR_SUF(x, A_T) ---> be replaced to x_a
这可能吗?
答案 0 :(得分:6)
在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
也是一个宏,那么你有一个问题,因为在连接它们之前没有好的方法来扩展一个令牌而不是另一个令牌。