簡體   English   中英

對於所有編譯器,C中的默認枚舉值是否相同?

[英]Are default enum values in C the same for all compilers?

在聲明如下所示的枚舉時,所有C編譯器都會在Linux和Windows系統上將默認值設置為x=0y=1z=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM