基于先前定义的条件编译

时间:2013-09-02 17:19:49

标签: c++11 conditional-compilation

我试图在C ++ 11中编写一个基于enums的程序来确定主应用程序的值。我知道以下工作:

namespace space
{
    enum class A { One, Two, Three };
}

space::A getSetting();

#define SETTING getSetting()

但我也希望根据第一个设置进行条件编译,以确定第二个设置,例如:

namespace space
{
    enum class A { One, Two, Three };
    enum class B { Red, Blue, Yellow };
    enum class C { Black, White };
    enum class D { Green, Orange };
}

space::A getSettingA();
space::B getSettingB();
space::C getSettingC();
space::D getSettingD();

#define SETTING_ONE getSettingA()
#if SETTING_ONE == A::One
    #define SETTING_TWO getSettingB()
#elif SETTING_ONE == A::Two
    #define SETTING_TWO getSettingC()
#else
    #define SETTING_TWO getSettingD()
#endif

这提供了" C4067的编译器警告:预处理器指令之后的意外令牌 - 期望换行符"。我做了一些研究,发现我不能在预处理器指令中使用范围运算符::,但有没有办法进行这种条件编译?

编辑:我基本上在寻找一种方法,将一个变量用于几个不同的enums,就像一个不透明的数据类型。使用#define是最简单的解决方案。我以相同的方式使用结果设置,因此我不想跟踪我正在使用的特定枚举,只需要一个名称来调用任何设置。

弃用:我已经决定为我的问题找到不同的解决方案,而不再寻求这个问题的答案。

1 个答案:

答案 0 :(得分:0)

这是错误的: #if SETTING_ONE == A :: One

你不能用预处理器做到这一点。

使用模板我会尝试类似traits的东西。

enum{
    One = 58,Two = 54, Red = 65, //...
};
struct A{
    static int value1 = One;
    static int value2 = Two;
};
struct B{
    static int value1 = Red;
    static int value2 = Blue;
};

template <typename T>
struct setting_T{
    static int value1 = T::value1;
    static int value2 = T::value2;
};

typedef setting_T<A> setting; // this is you choice for this compilation (you could use B)

使用它:

setting::value1 /* this is A::value1*/