我想更好地理解C99標準,但現在我很困惑在枚舉中使用枚舉作爲位域,如果它們被視爲int或作爲實現定義的類型。在C99的最終草案中查找時,我發現6.7.2.1段。 4枚舉爲位域實現定義類型嗎?
位字段應具有一種類型,是_Bool的合格或不合格的版本,符號int,無符號整型,或其他一些實現定義類型。
和6.7.2.2段。 4
每個枚舉類型應與炭,有符號整數類型,或一個無符號整數類型兼容。類型的選擇是實現定義的,但應能夠表示枚舉的所有成員的值。 ...
所以我用這個簡單的源代碼試圖
enum e {
E0, E1
};
struct s {
enum e bitfield : 4;
};
我可以用gcc-5.0編譯這個沒有警告和使用-std=c99 -Wall -Wextra -pedantic
鐺-3.5,但我得到的gcc-4.8以下警告
warning: type of bit-field 'bitfield' is a GCC extension
在這裏開始混亂。枚舉作爲位域被視爲int還是實現定義的類型?這是GCC-4.8中的一個錯誤還是他們改變了對標準的解釋?和其他C99編譯器一起使用它是否安全?
可能重複[使用位域與無符號字符時警告](http://stackoverflow.com/questions/10906238/warning-when-using-bitfield-with-unsigned-char) – 2015-11-07 21:07:23
@Rhymoid我不確定如果這真的是重複的。 AFAIK是無符號字符unsigned int的子類型,而枚舉可以等同於int。它也可能是我誤解了6.7.2.2段中的「與整數類型兼容」。 4. – fsasm
第一個引用意味着它是實現定義哪些其他類型允許用作位域 –