枚举数组在常量和宏上的优势?

时间:2012-07-25 11:25:14

标签: c++ enums

  

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

enum如何比#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

错误!!

它应该自动输入吗?或者它取决于编译器。在我的情况下,它给出了错误。

3 个答案:

答案 0 :(得分:4)

enum不同,

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

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

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

如果您在enum语句中使用了没有switch子句的所有可能的default值,那么现代编译器也会发出警告,这些语句无法检查{{ 1}}š

答案 1 :(得分:1)

如果你在C ++中使用枚举作为整数,你就会有气味。枚举定义了一个类型,只应使用该类型的值。 (我意识到这不是强制执行的,枚举可以解释为int,但是使用C ++通常不应该这样做。

另外,我的一个很大的烦恼:不要把#34; Type"在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);

答案 2 :(得分:1)

除了在其他答案中提出的观点之外,我还想补充以下内容:

如果你有多种类型,并且你需要迭代它们,你将不得不使用一个常量数组,这将是这样的:

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
}