2011-03-09 89 views
12

因此,一個枚舉是這樣工作的:爲什麼在#define一樣有效時使用枚舉?

enum { 
    false, 
    true 
} 

這相當於

int false = 0 
int true = 1 

我爲什麼不可以替代enum#define

#define FALSE 0 
#define TRUE 1 

對我來說,它似乎是可以互換的。我知道#define能夠處理參數,因此以與enum完全不同的方式運行。 enum當我們有#define在這種情況下什麼是主要用途?

如果我猜測,因爲#define是一個預處理器功能,enum會有一些運行時間優勢。我有多遠?

在此先感謝。

+1

請參閱http://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements – SirDarius 2011-03-09 08:56:02

+0

奇怪的是,那個沒有出現在我的搜索結果中。謝謝! – userenum 2011-03-09 09:02:17

+1

它不等同於'int false = 0'或'int const false = 0'(這會更合適)。 'int'變量會有一個地址,然後你可以做'&false',而你不能''enum'。 – 2011-03-09 10:40:05

回答

25

當你有一長串你想要映射成數字的東西時,枚舉的優點就顯示出來了,並且你希望能夠在該列表的中間插入一些東西。例如,你有:

 
pears 0 
apples 1 
oranges 2 
grapes 3 
peaches 4 
apricots 5 

現在你想橘子後橘子。用#定義,你必須重新定義葡萄,桃子和杏子的數量。使用枚舉,它會自動發生。是的,這是一個人爲的例子,但希望它給你的想法。

+1

是的,我現在看到了不同。謝謝! – userenum 2011-03-09 09:06:43

+4

這是一個很好的答案。 **但假設**讀者(可能是任何NOOB)知道她可以用'梨0'聲明一個'enum',而不是其他的。 – gideon 2014-11-25 03:04:45

13

我發現它在gdb等環境中的調試很有用,因爲枚舉值是在編譯時處理的(其中#define是一個預處理器宏),因此可用於內省。

0

枚舉是一個整數常量。所以,在編譯過程中會進行類型檢查。

+3

0和1也是整型常量。 – 2011-03-09 09:37:09

+0

謝謝你指出它正確的吉姆。我似乎已經閱讀了關於枚舉w.r.t的一些含義。類型轉換,並直接傳達它而不看真正的問題。另一個界限是在塊範圍內使用枚舉。 – 2011-03-11 10:58:23

+0

在C++中,枚舉是單獨的類型,但不是C. – 2011-03-11 22:37:42

3

儘管您的問題被標記爲C,但在使用C++編寫代碼時存在很大的優勢,您可以將enum:s放在類或名稱空間中。這樣你可以引用你的常量,比如'SpaceshipClass :: galaxy'。