web-dev-qa-db-ja.com

Cのデフォルトの列挙値はすべてのコンパイラで同じですか?

以下に示すように列挙型を宣言する場合、すべてのCコンパイラは、LinuxシステムとWindowsシステムの両方でx=0y=1、およびz=2としてデフォルト値を設定しますか?

typedef enum {
    x,
    y,
    z
} someName;
103
SSS

はい。列挙の定義で特に指定しない限り、初期列挙子の値は常にゼロであり、後続の各列挙子の値は前の列挙子よりも1大きくなります。

106
James McNellis

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でテスト済み。

Enum変数の最初の値が初期化されていない場合、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」になります。

4
Vignesh vicky