使用宏声明使用随机名称的变量

时间:2016-01-04 13:46:04

标签: c++ macros

我必须使用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(…)
}

2 个答案:

答案 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;
}

此代码声明三个名称为name0name1name2的整数。

由于这有一些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]而不是宏观污点。您可以根据需要获得尽可能多的实例,程序更易于理解和调试,并且更简洁。此外,您可以通过数组的索引访问变量,这是变量随机命名时无法做到的。