0

可能重复:
我应该使用#define、enum 还是 const?
#defines 与常量的优缺点?

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

错误!!

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

4

3 回答 3

4

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

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

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

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

于 2012-07-25T11:30:19.393 回答
1

如果您在 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);
于 2012-07-25T12:40:39.743 回答
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
}
于 2012-07-25T12:50:49.147 回答