2010-06-25 74 views
8

枚举和#定义似乎是能够做同样的事情,下面定义样式的例子。理解#define是编译器预处理器的宏替换。有没有什么情况比其他人更喜欢?枚举或定义,我应该使用哪一个?

typedef enum { 
    SelectionStyleNone, 
    SelectionStyleBlue, 
    SelectionStyleRed 
} SelectionStyle; 

VS

#define SELECTION_STYLE_NONE 0 
#define SELECTION_STYLE_BLUE 1 
#define SELECTION_STYLE_RED 2 
+0

另请参见:[我应该使用#define,枚举还是const?](http://stackoverflow.com/questions/112433/should-i-use-define-enum-or-const) – Shog9 2010-06-25 22:48:35

回答

3

枚举是,如果你想要的类型安全的最好的。它们也作为符号导出,所以一些调试器可以在线显示它们,而不能定义它们。

与课程的枚举的主要问题是,他们只能包含整数。对于字符串,浮动等...你可能会更好的const或定义。

+0

你是什么意思关于类型安全?这段代码是合法的:枚举E {A = 1}; E t = E(2);结果是未定义的。因此,枚举是类型安全的,但不重视安全,所以他们几乎是坏的定义/ – f0b0s 2010-06-25 22:21:00

+0

随着蒙上你可以做任何事情,这并不能证明任何事情。 – kmm 2010-06-26 16:39:09

11

千万不要使用定义,除非你必须有预处理器的功能。对于像枚举枚举一样简单的事情,请使用枚举。

1

定义很可能略高于枚举更快(在运行时),但它的好处大概只有周期极少数的,所以除非你正在做一些真正需要它的可以忽略不计。我会去enum,因为使用预处理器很难调试。

+1

我认为你的意思是“去与枚举”? – nall 2010-06-26 02:05:19

1

当有一个内置的语言特性支持你想做的事(在这种情况下,列举的项目)什么,你应该使用该功能。

0
#define DEFINED_VALUE 1 
#define DEFINED_VALUE 2 // Warning 
enum { ENUM_VALUE = 1 }; 
enum { ENUM_VALUE = 2 }; // Error 

#define引入微妙的错误的概率较高。

相关问题