可能重复:
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
错误!!
它应该自动输入吗?或者它取决于编译器。在我的情况下,它给出了错误。
答案 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
}