【问题标题】:Advantage of array of enum over constant and macro? [duplicate]枚举数组相对于常量和宏的优势? [复制]
【发布时间】:2012-07-23 19:40:11
【问题描述】:

可能重复:
Should I use #define, enum or const?
Advantage and disadvantages of #defines vs. constants?

枚举如何比#define 和 const 更有用。 内存和代码可见性的观点和可读性的观点。 我可以将(类型转换)枚举转换为 int 数组吗,如果我已经取了整数中的所有值。

例子:

    class MapPlt_clContainer { 
    public:  
    enum tagVectorType {       
    enVTAll = 0,       
    enVTPolygon,       
    enVTLines 
    }  
    };  

    tVoid MapPlt_clRender::vDrawLineClass( MapPlt_clContainer::tagVectorType* ) 

调用函数枚举时传递

vDrawLineClass( ClassArray_Group ); //Working

同时调用数组基地址传递

int test[3] =  
{       
5,       
6,       
7, 
};   

vDrawLineClass( test); //Not Working

错误!!

它应该自动类型转换吗?或者它取决于编译器。就我而言,它给出了错误。

【问题讨论】:

  • FWIW,stackoverflow.com/questions/112433/… 被标记为 C++,而这个问题被标记为 C,而 const 的工作方式在两者之间存在明显差异。
  • 另外:c 中没有类,并且在结构(或联合)定义中不允许使用 public: 标签。 :: 在 C 中总是语法错误,&(ClassArray_Group[5]) 中的括号是不需要的,这意味着面试官不确定他的语法。
  • 对不起,我编写了非常混乱的代码来演示这个场景。但我想知道如果我将数组基地址传递给期望枚举地址的函数,那么它会起作用吗?

标签: c++ enums


【解决方案1】:

enum 是一个单独的 type#define 不同,并且该语言(在编译器的帮助下)将帮助您确保不会混合不同 types 的值(即使它们具有相同的数值)。

此外,enum 的值可供调试器使用,而 #define 的原始含义在预处理期间(甚至在代码生成开始之前)丢失。

enum 类型转换为int 是一个自动内置过程,而相反的转换则比较棘手,因为并非所有int 值都对您的特定enum 有效。

如果您在没有default 子句的switch 语句中使用了所有可能的enum 值,现代编译器也会警告您,这是无法检查#defines 的东西

【讨论】:

    【解决方案2】:

    如果你在 C++ 中使用枚举作为整数,你就会有异味。枚举定义了一种类型,并且只应使用该类型的值。 (我意识到这不是强制的,枚举可以解释为 int,但对于 C++,它通常不应该)。

    另外,我的一个大烦恼:不要在 C++ 中的枚举名称中加上“类型”。枚举的值不是“类型”(在 C++ 的意义上)。一旦你开始编写模板代码,你就会讨厌所有类型名称中带有单词 Type 的枚举。

    此外,任何时候你试图在你的设计中进行类型转换,你都做错了。这在 C++ 中是一种可怕的气味。您不应该这样做,当然也不应该将其设计到您的代码中(即,将其用作“功能”)。

    最后,这部分:

    int test[3] =  
    {       
    5,       
    6,       
    7, 
    }; 
    
    vDrawLineClass( test); //Not Working
    

    这是一个直截了当的丑陋黑客。言出必行,言出必行:

    MapPlt_clContainer::tagVectorType test[3] =  
    {       
    MapPlt_clContainer::enVTAll,       
    MapPlt_clContainer::enVTPolygon,       
    MapPlt_clContainer::enVTLines 
    };
    
    vDrawLineClass( test);
    

    【讨论】:

    • 谢谢,我知道我想知道的了。
    【解决方案3】:

    除了其他答案中的观点,我想补充以下几点:

    如果您有多种类型并且需要对其进行迭代,则必须使用常量数组,如下所示:

    const int states[] = {STATE_1,STATE_2, STATE_3, STATE_4 };
    int numStates = sizeof(states)/sizeof(state[0]);
    for (int i = 0; i < numStates; i++) {
        // Do something with states[i]..
    }
    

    使用枚举,这可以简化为

    enum states{cState_1 = 0, cState_2, cState_3, cState_4, cNumStates};
    for (int i = 0; i < numStates; i++) {
        // do something with i
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      相关资源
      最近更新 更多