在C++中枚举变量何时计算
澄清:如果变量设置为全零,则该变量将中断。带有注释中的值的枚举工作正常 这是对我的代码的简化,问题在于接收枚举错误的用户。所以我的问题是什么时候对枚举进行求值?此外,我能想到的最好的枚举基本上都是整数,所以一个枚举变量为0时应该计算为false,并且在我将它们全部归零时永远不会到达抛出点在C++中枚举变量何时计算,c++,enums,C++,Enums,澄清:如果变量设置为全零,则该变量将中断。带有注释中的值的枚举工作正常 这是对我的代码的简化,问题在于接收枚举错误的用户。所以我的问题是什么时候对枚举进行求值?此外,我能想到的最好的枚举基本上都是整数,所以一个枚举变量为0时应该计算为false,并且在我将它们全部归零时永远不会到达抛出点 enum var_types//Set all to 0 to disable { VAR1 = 0x0, //var1 = 0x1 VAR2 = 0x0, //var2 = 0x2 VA
enum var_types//Set all to 0 to disable
{
VAR1 = 0x0, //var1 = 0x1
VAR2 = 0x0, //var2 = 0x2
VAR3 = 0x0, //var3 = 0x3
VAR4 = 0x0, //var4 = 0x4
VAR_NONE =0x0 //disabled = 0x0
};
func(int var){
if(var){
if(var==VAR1){ cout << VAR1 << endl;}
else if(var==VAR2){ cout << VAR2 << endl;}
else if(var==VAR3){ cout << VAR3 << endl;}
else if(var==VAR4){ cout << VAR4 << endl;}
else {throw job_error("enum error");}
}
//doing other things...
}
func(VAR1);
func(VAR2);
func(VAR3);
func(VAR4);
func(VAR_NONE);
代码的动机是在从代码顶部的单个位置对函数进行的多次调用中快速禁用对if语句的多次求值,同时还允许单独禁用它们。在代码中,大约有15个对func的调用分散在1200多行代码中。枚举归零是从一个位置禁用所有枚举的方便方法 在编译时定义了'VAR1..VAR4'的值,实际上允许将它们全部归零,这样int-var=0;var==VAR1;var==VAR2。。。所有的评估都是正确的。问题可能出现在您的代码中,您在代码中有;在每个if之后,这样一旦您纠正了由于其他错误而导致的编译器错误,您就可以输入所有if语句。 因此,对于以下改编代码,所有调用都不会产生枚举错误:
void func(int var){
if(var){
if(var==VAR1){}
else if(var==VAR2){}
else if(var==VAR3){}
else if(var==VAR4){}
else {cout << "enum error";}
}
//doing other things...
}
int main() {
func(VAR2);
func(VAR3);
func(VAR4);
}
所有枚举项都显式分配了值0x0,因此它们不可区分且均为零 您的评论表明您打算让它们具有不同的值——如果您没有为它们指定明确的有效性,它们会有不同的值 因此,如果您只是删除显式赋值,您应该得到您想要的
但我真正想知道的是;您在这里试图解决的实际问题是什么?所有枚举值都被强制为相同的值,因此您希望得到什么?枚举数是常量值。它们在编译时进行计算。清理ifs并使用开关。第一个if是额外的工作,并提供任何显著的性能增益。开关可以通过查表或数学函数进行计算。请尝试制作一个可编译的示例。如果没有前面的if,您的代码不会编译其他代码。@πάνταῥεῖ 我希望它们都计算为false,并跳过if/else块。据我所知,我应该能够将它们都设置为相同的值,而不赞成,这是为了调试方便,在正常情况下会有注释值。
void func(var_types var) { ... }
int main() {
func(1); // Compiler error, as `1` is not a valid var_types-member
}