【问题标题】:Are default enum values in C the same for all compilers?对于所有编译器,C 中的默认枚举值是否相同?
【发布时间】:2011-09-20 00:25:43
【问题描述】:

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

typedef enum {
    x,
    y,
    z
} someName;

【问题讨论】:

  • 是的,这是标准要求的,我相信有人会引用它们。

标签: c enums


【解决方案1】:

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

【讨论】:

  • 而且,C 和 C++ 都需要这种相同的行为。在 C++ 中,它是 [dcl.enum]:“如果第一个枚举器没有初始化器,则相应常量的值为零。没有初始化器的枚举器定义为枚举器提供了通过将前一个枚举器的值加一而获得的值。 "
  • 是的,还有其他以字母 C 开头的语言,比如 C#。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    是的,枚举值默认从 0 到第 n 个元素到任何平台。

    【讨论】:

    • 考虑您的答案如何添加到答案池中。也就是说,您的新答案(5 年后)如何添加其他答案未涵盖的新内容?乍一看,它似乎比其他两个答案提供的信息少。
    • Ehhh @LawfulEvil 放松一下。多个答案让人们在未来看到这个问题的多个视角。也就是说,这是一个格式不正确、信息不足的答案,但足够的答案本身也不错。
    【解决方案4】:

    如果枚举变量的第一个值没有被初始化,那么 C 编译器会自动赋值 0。编译器会继续将前面的枚举变量的值增加 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'。

    【讨论】:

    • mar 是't' 不能保证,可能存在字母不按字母顺序排列的字符集
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2011-02-19
    • 2011-10-27
    相关资源
    最近更新 更多