C 语言中的默认枚举值对于所有编译器都是相同的吗?

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

typedef enum {
x,
y,
z
} someName;
75016 次浏览

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

C99标准型

N1265 C99草案在6.7.2.2/3表示“枚举说明符”

An enumerator with = defines its enumeration constant as the value of the constant expression. If the first enumerator has no =, the value of its enumeration constant is 0. Each subsequent enumerator with no = 将其枚举常数定义为通过将1添加到前一个枚举常数的值中而获得的常数表达式的值。(使用具有 = 的枚举数可能会生成具有与同一枚举中的其他值重复的值的枚举常数。)

因此,以下内容始终坚持一致的实施:

总机

#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中测试。

Yes,enum value bydefult start from 0 to n'th element to any platform.

If the first value of the enum variable is not initialized then the C compiler automatically assigns the value 0.The compiler keeps on increasing the value of preceeding enum variable by 1.

例如:

enum months{jan,feb,mar}

Explanation: Jan 的值是0,Feb 是1,mar 是2。

enum months{jan=123,feb=999,mar}

说明: 一月的价值是123,二月的是999,三月的是1000。

enum months{jan='a',feb='s',mar}

说明: Jan 的值是‘ a’,feb 的值是‘ s,mar 的值是‘ t’。