2015-10-25 89 views
11

因此,通常枚舉的是用於聲明「恆定整數」組作爲另一種類型,它代表了一些東西。例如。此枚舉聲明符合標準嗎?

enum Color {RED=0, BLUE, YELLOW}; 

這很明確。但最近我在代碼中遇到了以下內容。這是嵌入式系統的編譯器。

enum State {DISABLED=0, ENABLED=!DISABLED}; 

它工作得很好。它表現爲布爾類型。我的問題是,它(這個語法)是否符合ANSI?

如果是符合標準的,那麼爲什麼編譯器定義內部像_Bool布爾表示,然後在stdbool.h(對於C語言),他們做的:的

#define bool _Bool 
... // here goes definitions of true and false 

代替

enum bool {false=0, true=!false}; 

哪個更清潔?

+0

ANSI是否符合?這是我一段時間沒聽說過的一句話。 –

+0

@DawidPi C和C++是不同的語言,像這樣的微妙問題幾乎從來沒有得到一個同時涵蓋兩種語言的好答案。如果你真的想知道兩種語言,請將它們作爲單獨的問題詢問。 – hvd

+0

@AlanStokes如果您在編輯時遇到了問題,我在評論中特別說明了這一點,但在沒有任何評論的情況下將其恢復原樣似乎很粗魯。我不想捲入這場關於回滾的戰爭,但就我而言,這個問題在原來的狀態下過於寬泛,如果你想阻礙嘗試將它變成適當的形狀,那麼罰款,我只是投票結束。 (當然,這當然不意味着它實際上最終會關閉。) – hvd

回答

3

是的,該聲明在C和C++中都是完全有效和可移植的。

在C和C++,這樣:

enum State {DISABLED=0, ENABLED=!DISABLED}; 

是完全等同於這樣的:

enum State {DISABLED=0, ENABLED=1}; 

並向該:

enum State {DISABLED, ENABLED}; 

但微妙的不同的原因。

在C中,一元!操作者產生int類型的結果,具有值要麼0(如果操作數不等於0)或1(如果操作數是等於0)。 !x相當於x == 0。 (當用作條件時,任何非零值都視爲true,但運算符!==等總是產生正好爲01的結果。)枚舉常量始終爲int;如果指定了值,則必要時將其轉換爲int

(C在1999年的標準添加型_Bool,但其產生邏輯上所有運營商「布爾」值仍然產生int類型的結果。)

在C++中,一元!操作符的結果是bool類型的。結果是falsetrue其中C的!運營商將分別產生01。和C一樣,如果指定了一個值,它會根據需要進行轉換; boolfalsetrue分別轉換爲01

在C中,枚舉常量的類型始終爲int。在C++中,它們是枚舉類型,在此例中爲enum State

引用同一類型聲明中較早的枚舉常量是合法的。每個枚舉常量在聲明後都可見。

至於類似:

enum bool { false = 0, true = !false); 

更清澈比

enum bool { false = 0, true = 1 }; 

(在C,它會在C++是非法的),我尊重不同意見。對於熟悉C的人來說,常數1是完全清楚的。將其重寫爲!false沒有幫助。事實上,當<stdbool.h>不可用(東西是罕見的,這些天),我用:

typedef enum { false, true } bool; 

falsetrue將給予他們正確的價值觀,這一事實是恕我直言十分明顯的。至於爲什麼C99沒有使用像這樣的enum定義,我懷疑這是因爲每個枚舉類型都與一些實現定義的整數類型兼容。 (對於gcc,通常是unsigned intint。)該委員會要求_Bool是一個不同類型的轉換等級低於任何其他整數類型的轉換等級。 (並且他們不能在不破壞現有代碼的情況下使bool成爲關鍵字。)

3

按照C標準(6.2.1作用域標識符)

每個枚舉常數具有範圍,僅僅在枚舉列表中 外觀其定義枚舉的之後開始

的在C++中也是如此(3.3.2申報點)

5枚舉器的聲明點緊接在其 枚舉定義。[實施例:

const int x = 12; 
{ enum { x = x }; } 

這裏,枚舉x初始化與恆定 x的值,即12末端示例]

所以你可以在枚舉中的下一個枚舉器的定義中使用已定義的枚舉器。

至於C類型_Bool然後它出現在C 99本標準之前已經有使用,也可以表現常量或枚舉在C.

沒有意義來定義像這樣

enum bool {false=0, true!=false}; 
枚舉

因爲_Bool類型已經有兩個值0和1.

6

是的,這是符合標準的。

!DISABLED是有效的常數表達式,這是enum值所需的全部值。

enum State {DISABLED=0, ENABLED= (!DISABLED)}; 
//        ^^^^^^^^^^^ 

在其中DISABLED引用的點,編譯器知道其值,所以它能夠計算從它衍生的表達,即!DISABLED的值。這是寫作ENABLED=1的一種奇特方式。

+0

並且是否有任何正當的理由讓一個人只寫'ENABLED = 1'(甚至'= 1'可能是多餘的,除非你想讓它「清除」) – Jack

+0

「這是一種奇特的寫作方式'ENABLED = 1'是不正確的。一個'int'的大小,而'!DISABLED'並不意味着加1,而是'不爲0',它被直接打入代碼中,無論編譯器看到'ENABLED' – user3629249

+0

@ user3629249:什麼? – Ryan