【发布时间】:2017-06-23 20:30:30
【问题描述】:
澄清设置为全零的变量是它中断的情况。具有 cmets 值的枚举工作正常。
这是我的代码的简化,问题是收到“枚举错误”。所以我的问题是枚举何时被评估?另外,我能想到的最好的枚举基本上是整数,因此枚举变量为 0 应该评估为假,并且当我将它们全部归零时永远不会达到抛出。
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”语句的多次评估,同时还允许单独禁用它们。在分散在 1200 多行代码中的代码中,大约有 15 次“func”调用。枚举的归零是一种方便的方法,可以从一个地方全部禁用它们。
【问题讨论】:
-
你所有的枚举值都被强制为相同的值,那么你期望什么??
-
枚举器是常量值。它们在编译时进行评估。
-
清理您的
ifs 并使用switch。第一个if是额外的工作,并且确实提供了任何显着的性能提升。switch可以通过查表或数学函数求值。 -
请尝试制作一个可编译的例子。您的代码无法编译(“else without previous if”)。
-
@ πάντα ῥεῖ 我希望它们都评估为假并跳过 if/else 块。据我所读,我应该能够将它们全部设置为相同的值,虽然不赞成,但它是为了调试方便,并且在正常情况下将具有注释值。