wei*_*wei 3 c macros c-preprocessor
我有
#define A_T 1
#define B_T 2
int x_a = 1, x_b =2;
Run Code Online (Sandbox Code Playgroud)
如何定义一个宏,它可以将后缀_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
Run Code Online (Sandbox Code Playgroud)
这可能吗?
您需要在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
Run Code Online (Sandbox Code Playgroud)
没有额外的间接,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
Run Code Online (Sandbox Code Playgroud)
这将导致首先发生连接,然后扩展宏,然后将发生其他连接
如果x
也是一个宏,那么你有一个问题,因为在连接它们之前没有好的方法来扩展一个令牌而不是另一个令牌.