2013-05-13 94 views
3

C代码宏:串联符号conditonally

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

我如何定义一个宏,它可以连接后缀_a和_B到变量的名字吗?

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 

这可能吗?

+1

[C预处理器和串联]的可能重复(http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation) – 2013-05-13 23:17:26

回答

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),那么它会被第一取代。您可避免通过后缀宏观去除##的间接:

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

+0

这似乎并不奏效。看起来像A_T总是首先被替换为1。 – wei 2013-05-13 23:56:03

+0

是的,如果'A_T'也被定义为一个宏,那么它将首先被替换。避免这种情况需要直接做SUFFIX而不是宏 – 2013-05-14 14:02:24