我正在尝试做类似以下的事情:
enum E;
void Foo(E e);
enum E {A, B, C};
Run Code Online (Sandbox Code Playgroud)
编译器拒绝的.我已经快速浏览了一下Google,而且共识似乎是"你做不到",但我无法理解为什么.谁能解释一下?
澄清2:我这样做是因为我在类中使用私有方法来获取枚举,并且我不希望枚举枚举值 - 例如,我不希望任何人知道E被定义为
enum E {
FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X
}
Run Code Online (Sandbox Code Playgroud)
因为项目X不是我希望用户了解的东西.
所以,我想转发声明枚举,以便我可以将私有方法放在头文件中,在cpp内部声明枚举,并将构建的库文件和标题分发给人.
至于编译器 - 它是GCC.
假设我们有一些命名的枚举:
enum MyEnum {
FOO,
BAR = 0x50
};
Run Code Online (Sandbox Code Playgroud)
我搜索的是一个脚本(任何语言),它扫描我项目中的所有标题,并生成一个标题,每个枚举一个函数.
char* enum_to_string(MyEnum t);
Run Code Online (Sandbox Code Playgroud)
以及类似这样的实现:
char* enum_to_string(MyEnum t){
switch(t){
case FOO:
return "FOO";
case BAR:
return "BAR";
default:
return "INVALID ENUM";
}
}
Run Code Online (Sandbox Code Playgroud)
这个问题确实与typedefed枚举和未命名的C风格枚举有关.有人知道这个吗?
编辑:解决方案不应该修改我的源,除了生成的函数.枚举是在API中,因此使用迄今为止提出的解决方案不是一种选择.
使用以下代码(为简洁起见摘录):
color.h:
class color {
public:
color();
enum colorType {
black, blue, green, cyan, red,
magenta, brown, lightgray, nocolor
};
colorType getColorType();
void setColorType(colorType cColortype);
string getColorText() const;
private:
colorType cColortype = nocolor;
map<int, string> colors = {
{black, "black"},
{blue, "blue"},
{green, "green"},
{cyan, "cyan"},
{red, "red"},
{magenta, "magenta"},
{brown, "brown"},
{lightgray, "lightgray"},
{nocolor, "nocolor"}};
};
Run Code Online (Sandbox Code Playgroud)
color.cpp:
color::color() {
}
color::colorType color::getColorType() {
return cColortype;
}
void color::setColorType(colorType cColortype) {
this->cColortype = cColortype;
}
string color::getColorText() const {
return …Run Code Online (Sandbox Code Playgroud)