对于所有编译器,C中的默认枚举值是否相同?

时间:2011-06-22 02:02:59

标签: c enums

如下所示声明枚举时,所有C编译器都会在Linux和Windows系统上将默认值设置为x=0y=1z=2吗?

typedef enum {
    x,
    y,
    z
} someName;

4 个答案:

答案 0 :(得分:103)

是。除非您在枚举的定义中另行指定,否则初始枚举器的值始终为零,并且每个后续枚举器的值都大于前一个枚举器的值。

答案 1 :(得分:62)

C99标准

N1265 C99 draft在6.7.2.2/3“枚举说明符”

中说
  

带枚举的枚举器将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常量的值为0.每个后续的枚举数都没有=   将其枚举常量定义为通过将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中测试。

答案 2 :(得分:3)

如果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'。

答案 3 :(得分:-15)

是的,枚举值bydefult从0开始到第n个元素到任何平台。