C++11 基于先前定义的条件编译
我试图用C++11编写一个基于C++11 基于先前定义的条件编译,c++11,conditional-compilation,C++11,Conditional Compilation,我试图用C++11编写一个基于enum的程序,以确定主应用程序的值。我知道以下工作: namespace space { enum class A { One, Two, Three }; } space::A getSetting(); #define SETTING getSetting() 但我还想基于第一个设置进行条件编译,以确定第二个设置,例如: namespace space { enum class A { One, Two, Three }; enu
enum
的程序,以确定主应用程序的值。我知道以下工作:
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:预处理器指令后出现意外标记-需要换行符”。我做了一些研究,发现我不能在预处理器指令中使用作用域操作符:
,但是有没有办法进行这种条件编译
编辑:我基本上是在寻找一种方法,将一个变量用于几个不同的枚举
,比如不透明的数据类型。使用#define
是最简单的解决方案。我以同样的方式使用结果设置,所以我不想跟踪我使用的特定枚举,只需要使用一个名称来调用任何设置
不推荐:我已决定为我的问题找到一个不同的解决方案,不再寻求这个问题的答案。这是错误的:#如果设置_ONE==a::ONE
您不能使用预处理器执行此操作
对于模板,我会尝试一些类似特征的东西
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)
我知道代码不能正常工作。我正在寻找一种方法来进行这种条件编译。你不能使用枚举。也许是模板?你能提供一个使用模板的例子吗?你能告诉我你想如何使用它(在你的代码中)我的意思是这个设置的结果我希望能够像使用
后面的枚举
一样使用它。因此,我没有使用space::B::Red
,而是使用SETTING_TWO
,因为SETTING_TWO
可以是三个不同的枚举中的任意一个。然后我使用toString()
函数获取名称并打开正确的.xml文件。getSettingA()
的值只能在运行时确定。您希望编译器如何在编译时学习它-使用时间机器?另外,您计划如何使用设置\u TWO
(假设您设法定义了它)?你能举个例子吗?它可能有几种不同类型中的一种,基本上是不可预测的。此外,您是否依赖“#SETTING_TWO”
将其设置为“getSettingB()”
等等?这个问题对我来说太模糊了taste@JohannesSchaub-litb I对每个设置使用相同的格式,但枚举中的值各不相同。我不依赖于将\u TWO设置为任何特定的枚举,因为它们的使用方式完全相同。请看我的编辑。
setting::value1 /* this is A::value1*/