3

I have

#define A_T 1
#define B_T 2
int x_a = 1, x_b =2;

How can I define a macro, which can concatenate the suffix _a and _b to the var name?

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

Is this possible?

4

1 回答 1

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也是一个宏,那么您就有问题了,因为在连接它们之前没有扩展一个令牌而不是另一个令牌的好方法。

于 2013-05-13T23:38:10.040 回答