2012-03-20 69 views
5
class Test 
{ 
    enum{}; 
    ... 
}; 

這是空的枚舉定義是否可移植?在gcc和和msvc中編譯。是空的枚舉(enum {};)是否可移植?

+9

你在使用它的編譯? – Cameron 2012-03-20 14:18:42

+0

在一個宏可能有一個空參數 – 2012-03-20 14:46:44

+0

這不僅僅是一個空的枚舉,它是一個匿名的空枚舉,如其他答案中所述,它是不合格的,因爲它沒有聲明任何東西。所以,空的枚舉是valids,這是無效的匿名空枚舉。你可以聲明'enum {A}'和'enum e {}',這是有效的聲明。 – 2017-09-14 21:07:20

回答

8

這樣的枚舉在C++標準的第7條第3款中被具體列出爲 不合格。 gcc不接受它。有gcc的一個bug修復此:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29018

+1

我錯過了。語法允許表單,但是在章節標題中,實際上有一個特定的禁止,它不聲明任何類型或實體(變量,函數或引用)。並以此案例爲例。 – 2012-03-20 14:23:49

+2

@Nawaz WeaselFox引用的段落存在於C++ 98,C++ 03和C++ 11中,並且沒有改變,並有這個確切的例子。 – 2012-03-20 14:29:05

4

據來自C++標準下面的代碼片段,我們可以推斷,這是確實是一個有效的語句:

7.2/1 枚舉聲明(C++ 03)
...
枚舉符:
             枚舉標識選擇 {枚舉列表選擇}

注意,無論是標識枚舉列表是可選的,爲此的語句enum {}是有效的(如果你問標準)。


但是標準還沒有說空白聲明是不合格嗎?

是的,在標準的下面片段中甚至有一個enum { };的例子。

/3 說明符(C++ 03)

在這些情況下,每當一類說明符或枚舉說明符是 存在於DECL說明符-SEQ,標識符在這些說明符中, 是聲明中聲明的名稱(類別爲 名稱,枚舉名稱或枚舉器,具體取決於語法)。

在這種情況下,與除了未命名的位字段 (9.6)的聲明,DECL說明符-SEQ將介紹一個或多個名稱到 該程序,或應當重新聲明引入的名稱由之前的 聲明。

*實施例[

enum { };   // ill-formed 
typedef class { }; // ill-formed 

*端示例]


結論

聲明似乎是病雖然編譯器是由人類編寫的 - 人類傾向於犯錯誤,有時忽略了一些東西,但仔細觀察標準後形成的。


TL; DR你不應該使用空聲明,如enum { };,即使它

+0

但是正如WeaselFox所指出的那樣,在§7/ 3中有一個用於__all__聲明的通用語義約束, ,它有效地禁止聲明 ,這些聲明不聲明任何東西。它給出的一個例子是'enum {};'。 – 2012-03-20 14:34:09

+0

@JamesKanze回答更新,謝謝你的提醒,我完全忘了'7.1/3'。 – 2012-03-20 14:41:47

+0

@refp我也錯過了,直到WeaselFox指出它。 ( 部分是§7/ 3,而不是§7.1/ 3。) – 2012-03-20 14:46:55