2012-12-07 53 views
5

我需要根據enum有多少元素分配一個數組。我做了以下操作:枚舉成員可以是ANSI-C中數組的大小嗎?

enum { A, B, C, LAST }; 
char buf[LAST]; 

即使使用-ansi -pedantic標誌,也可以正常工作。但是我不確定它是否是GCC或clang(它支持大多數,如果不是全部GCC擴展)擴展,或者真的被ANSI C標準允許,並且在ANSI-C標準的任何C編譯器中都能正常工作。有人可以澄清它嗎?

回答

6

C89(第3.5.2.2節)和C99(第6.7.2.2節)標準均定義Ë枚舉相同的方式:

6.7.2.2枚舉SPECI音響ERS(第3段),http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

3.5.2.2枚舉說明符(第3段),http://flash-gordon.me.uk/ansi.c.txt

同時讀取:

[...]具有=定義的枚舉器它的枚舉常量作爲常量表達式的值。如果第一個枚舉數的值爲no,則枚舉常量的值爲0.每個隨後的具有no =的枚舉值都將其枚舉常量定義爲常數表達式的值,該常數表達式是通過將1加到先前的枚舉常量的值中獲得的。 [...]

因此,在您的語法中,任何符合標準的編譯器都將正確運行您的代碼。

2

這工作正常,即使有-ansi -pedantic標誌

因此,這不是一個GNU擴展。是的,這在ANSI C中很好,因爲enum的成員是常量表達式。

+0

這假設海灣合作委員會是100%符合標準:-) –

1

從C標準,段落6.2.5(類型):

16枚舉包括一組命名爲整數常量的值。每個不同的枚舉構成一個不同的枚舉類型。

17 char類型,有符號和無符號整數類型以及枚舉類型統稱爲整數類型。

另外,段落6.7.2.2(枚舉說明符):

定義枚舉常數的值應 是整數常量表達式具有值可表示爲 INT的表達。

2

有人可以澄清它嗎?

我敢肯定你知道,一個枚舉只是底肥一個標籤,一個數字:

enum 
{ A, // 0 
    B, // 1 
    C, // 2 
    LAST // 3 
}; 

所以真的:

char buf[LAST]; 

是沒有什麼不同:

char buf[3]; 
2

正如其他人所說,它是有效的。但我認爲迄今爲止沒有人引用過正確的部分。從N1256 C99 draft相關的有:6.6「常量表達式」第6款:

整型常量expression99)應具有整數類型,並應只能是整型常量,枚舉常量操作數[...]

,然後6.7.5.2「組聲明」第4段:

如果尺寸是整數常量表達式和元素類型具有已知的恆定大小,陣列類型是不是一個可變長度數組類型[...]

所以基本上:

  • 枚舉常數是常量表達式
  • 用於陣列不被變長,就需要一個常量表達式

相信6.7.2.2「枚舉說明符「,其他人引用了關於聲明enum的說法,而不是使用枚舉器。當然,因爲在聲明它們時需要編譯時間常量,我們期望它們在表達式中使用時也應該是編譯時間常量。

+1

謝謝。對於之前沒有引用標準中正確部分的答案,你是對的。關鍵概念是證明枚舉值和聲明時的數組大小是完全相同的值。 – cesss