可能重复:
我应该使用#define、enum还是const
#defines与常量的优缺点?
枚举将如何比#define和const更有用。内存和代码的可视性和可读性。如果我已经取了integer中的所有值,我可以将(类型cast)enum转换为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
错误!!
它应该自动进行类型转换吗?或者它依赖于编译器。就我而言,这是一个错误。
enum
是一个独立的类型,与#define
不同,该语言(在编译器的帮助下)将帮助您确保不会混合不同类别的值(即使它们具有相同的数值)。
此外,enum
的值可用于调试器,而#define
的原始含义在预处理时间期间(甚至在代码生成开始之前)丢失。
将enum
类型转换为int
是一个自动的内置过程,而相反的转换则更为棘手,因为并非所有的int
值都适用于特定的enum
。
如果您在没有default
子句的switch
语句中使用了所有可能的enum
的值,则现代编译器也会警告您,这是无法检查#define
的的
如果在C++中使用枚举作为整数,则会有气味。枚举定义一个类型,并且只应使用该类型的值。(我意识到这是不强制的,枚举可以被解释为int,但使用C++通常不应该这样)。
另外,我的一个大毛病是:不要在C++中的枚举名称中加"Type"。枚举的值不是"类型"(在C++的意义上)。一旦开始编写模板代码,就会讨厌所有类型名称中包含"类型"一词的枚举。
此外,任何时候你试图在你的设计中打字,你都做错了。这在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);
除了其他答案中的要点外,我想添加以下内容:
如果你有多个类型,并且你需要对它们进行迭代,你将不得不使用一个常量数组,它将是这样的:
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
}