如何避免#define语法的变量重新声明?

Jam*_*mes -1 c++ c-preprocessor

当我们在c ++中传递类类型的参数时,我们别无选择,只能使用#define.但这会使代码变得混乱.

#include <vector>
#define APPEND(className) \
        base = new className(); \
        baseVector.push_back(base); \

class Base{};
class Child1 : public Base{};
class Child2 : public Base{};
// ...
class Child10 : public Base{};
std::vector<Base*> baseVector;
int main(void){
    Base* base; // I want to remove this
    APPEND(Child1);
    APPEND(Child2);
    // ...
    APPEND(Child10);
}
Run Code Online (Sandbox Code Playgroud)

如果我将Base*base放在#define语法中,则会发生重新声明错误.但是,如果我愿意的话,它看起来很尴尬.

#define APPEND(className) \
        #ifndef DECL \
        Base* base; \
        #define DECL \
        #endif \
        base = new className(); \
        baseVector.push_back(base); \
Run Code Online (Sandbox Code Playgroud)

这是不可能的.有没有办法实现这个目标?

Ore*_*lom 5

首先,你的代码甚至都没有编译.这是一个固定版本:

#include <vector>

class Base{};

class Child1 : public Base {};
class Child2 : public Base {};

std::vector<Base*> baseVector;

int main(void)
{
    baseVector.push_back( new Child1 );
    baseVector.push_back( new Child2 );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

你绝对不需要任何#define技巧.这几乎总是不好的做法,当然在你的情况下.