【问题标题】:When do Enumerated variable evaluate in C++ [closed]枚举变量何时在 C++ 中求值 [关闭]
【发布时间】: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 块。据我所读,我应该能够将它们全部设置为相同的值,虽然不赞成,但它是为了调试方便,并且在正常情况下将具有注释值。

标签: c++ enums


【解决方案1】:

'VAR1..VAR4' 的值是在编译时定义的,实际上允许“将它们全部归零”,这样int var=0; var==VAR1; var==VAR2; ... 的计算结果都为“真”。问题可能出在您的代码中,每个if 后面都有;,这样(一旦您更正了由于错误else 而导致的编译器错误),您可能会输入所有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);
}

但是请注意,您通常也会使用enum-type 作为参数类型。这将保护您在编译时不使用“未定义的枚举值”:

void func(var_types var) { ... }

int main() {

    func(1);  // Compiler error, as `1` is not a valid var_types-member
}

【讨论】:

    【解决方案2】:

    您的所有枚举条目都显式分配了值 0x0,因此它们无法区分(并且全为零)。

    您的 cmets 表明您打算让它们具有不同的值 - 如果您没有为它们分配明确的值,它们会这样做。

    所以,如果你只是删除显式赋值,你应该得到你想要的。

    但我真正想知道的是;您在这里试图解决的实际问题是什么?

    【讨论】:

      猜你喜欢
      • 2017-09-09
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      相关资源
      最近更新 更多