我必须使用Inst
语法…
来定义类型为NEWNSTANCE
的新实例,其中NEWINSTANCE
是一个宏。很明显,使用以下代码,编译器会抱怨ex
的重新定义,但我必须遵循这种语法。
// error redefinition ok very clear
#define NEWINSTANCE Inst ex(…)
int main() {
NEWINSTANCE;
NEWINSTANCE;
NEWINSTANCE;
}
我无法写NEWINSTANCE(name)
来获取inst name(…)
。现在我想为新实例创建“随机”名称。我不在乎具体名称。
是否可以写ex ## __LINE__ (…)
之类的内容,以获得Inst ex1(…)
,Inst ex2(…)
及其中的多个内容?
我正在考虑这样的事情,但它没有按预期工作。
#define NEWINSTANCE Inst ex ## __LINE__ (…)
int main() {
NEWINSTANCE; // Inst ex6(…)
NEWINSTANCE; // Inst ex7(…)
NEWINSTANCE; // Inst ex8(…)
}
答案 0 :(得分:1)
如果您正在使用GCC,则会有__COUNTER__
宏。
用法示例:
#define XCONCAT(x, y) x##y
#define CONCAT(x, y) XCONCAT(x, y)
#define NEWINSTANCE int CONCAT(name, __COUNTER__)
int main(){
NEWINSTANCE;
NEWINSTANCE;
NEWINSTANCE;
}
此代码声明三个名称为name0
,name1
和name2
的整数。
由于这有一些downvotes,我将扩展这种计数器的一个潜在用例 - 编译时断言:
#define XCONCAT( x, y ) x##y
#define CONCAT( x, y ) XCONCAT( x, y )
#define NEWINSTANCE(name) CONCAT(name, __COUNTER__)
#define COMPILE_TIME_ASSERT(condition) \
int NEWINSTANCE(assert_variable_)[(condition) - 1];
COMPILE_TIME_ASSERT(1 > 0);
COMPILE_TIME_ASSERT(2 > 1);
好处是,人们不必引入虚拟变量名称或将宏放在函数中以依赖范围规则来避免多个定义。
您需要在第一行中显示XCONCANT
内容的原因,例如this SO answer。
答案 1 :(得分:1)
虽然可能有办法(请参阅kfx的回答),但我不相信有理由这样做。
考虑您认为需要宏 for 的内容。你想要的只是一些类型的实例。我建议使用Inst ex[3]
而不是宏观污点。您可以根据需要获得尽可能多的实例,程序更易于理解和调试,并且更简洁。此外,您可以通过数组的索引访问变量,这是变量随机命名时无法做到的。