【发布时间】:2013-09-02 17:19:49
【问题描述】:
我正在尝试用 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 是最简单的解决方案。我以相同的方式使用生成的设置,因此我不想跟踪我正在使用的特定枚举,只需一个名称即可调用任何设置。
已弃用:我已决定为我的问题找到不同的解决方案,并且不再寻求此问题的答案。
【问题讨论】:
-
getSettingA()的值只能在运行时确定。您如何期望编译器在编译时学习它 - 使用时间机器?另外,您打算如何使用SETTING_TWO(假设您设法以某种方式定义它)?你能举个例子吗?它可能有几种不同类型中的一种,基本上是不可预测的。 -
另外,你是否依赖
"#SETTING_TWO"成为"getSettingB()"等等?对我来说太模糊的问题 -
@JohannesSchaub-litb 我对每个设置都使用相同的格式,但
enums中的值与下一个不同。我不依赖SETTING_TWO作为任何特定的枚举,因为它们的使用方式相同。请查看我的编辑。
标签: c++11 conditional-compilation