在C中使用宏内的宏名称

时间:2017-04-05 13:01:34

标签: c macros self

#define V_M1 10
#define A_M1 60
#define V_M2 15
#define A_M2 56

#define M1 { V_M1, A_M1 }
#define M2 { V_M2, A_M2 }
int m1[]=M1, m2[]=M2;

有没有办法简化M1和M2宏的定义,这样我就不必在里面重复它们的名字(由于宏的实际复杂性,我的情况下的错误来源)?类似的东西:

#define M1 { V_MyOwnName, A_MyOwnName }
#define M2 { V_MyOwnName, A_MyOwnName }

2 个答案:

答案 0 :(得分:6)

使用类似函数的宏

添加间接级别
#define EXPAND(name) { V_##name, A_##name }
#define M1 EXPAND(M1)
#define M2 EXPAND(M2)

##是令牌连接运算符,它将V和您传递的任何内容作为name并粘合它们以形成单个标记。如果结果是另一个宏,它会进一步扩展。

答案 1 :(得分:1)

像这样的宏往往是值得怀疑的做法。考虑将您的值分组为consttruct或类似的,以便更好地进行程序设计。

话虽如此,如果您在其上投放足够的邪恶宏,C中的所有内容都是可能的。除了使用宏之外别无选择,我会做这样的事情:

#define M(n) { V_M ## n, A_M##n }
int m1[]=M(1), m2[]=M(2);