[英]Are default enum values in C the same for all compilers?
在聲明如下所示的枚舉時,所有C編譯器都會在Linux和Windows系統上將默認值設置為x=0
, y=1
和z=2
嗎?
typedef enum {
x,
y,
z
} someName;
是。 除非在枚舉的定義中另行指定,否則初始枚舉器的值始終為零,並且每個后續枚舉器的值都大於前一個枚舉器的值。
C99標准
N1265 C99草案在6.7.2.2/3“枚舉說明符”中說
帶=的枚舉器將其枚舉常量定義為常量表達式的值。 如果第一個枚舉數沒有
=
,則其枚舉常量的值為0.每個后續的帶有no的枚舉數將其枚舉常量定義為通過將1加上前一個枚舉常量的值而獲得的常量表達式的值。 (使用帶枚舉的枚舉數可能會產生枚舉常量,其值與同一枚舉中的其他值重復。)
因此,以下內容始終適用於符合要求的實現:
main.c中
#include <assert.h>
#include <limits.h>
enum E {
E0,
E1,
E2 = 3,
E3 = 3,
E4,
E5 = INT_MAX,
#if 0
/* error: overflow in enumeration values */
E6,
#endif
};
int main(void) {
/* If unspecified, the first is 0. */
assert(E0 == 0);
assert(E1 == 1);
/* Repeated number, no problem. */
assert(E2 == 3);
assert(E3 == 3);
/* Continue from the last one. */
assert(E4 == 4);
assert(E5 == INT_MAX);
return 0;
}
編譯並運行:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
在Ubuntu 16.04,GCC 6.4.0中測試。
如果未初始化枚舉變量的第一個值,則C編譯器會自動賦值0.編譯器會繼續將enum變量的值增加1。
例如:
enum months{jan,feb,mar}
說明:jan的值為0,feb為1,mar為2。
enum months{jan=123,feb=999,mar}
說明:jan的值為123,feb為999,mar為1000。
enum months{jan='a',feb='s',mar}
說明:jan的值為'a',feb將為's',mar將為't'。
是的,枚舉值bydefult從0到n'元素開始到任何平台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.