5

我之前听说过,如果我没有做一些聪明的事情,比如将值用作位掩码,我应该让编译器选择为枚举常量分配哪些值。如果我只是将枚举值用于更明确的代码文档,那么如果我没有明确定义所有值,是否会有任何陷阱?我相信值是按升序分配的。我应该定义第一个值以确保每次连续编译的值相同吗?

4

2 回答 2

7

从 C99,第 6.7.2.2p3 节:

枚举器列表中的标识符被声明为具有 int 类型的常量,并且可以出现在任何允许的地方。带有 = 的枚举器将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常数的值为0。后续每个没有=的枚举数将其枚举常数定义为前一个枚举常数的值加1得到的常数表达式的值。(使用带 = 的枚举数可能会产生枚举常量,其值与同一枚举中的其他值重复。)

唯一需要为第一个枚举器赋值的情况是,如果你希望它的值不同于0. 通常,您不会这样做,因为枚举数通常用于索引数组。

下面是一个“前一个值加 1”的简单示例。

enum {
  A,
  B,
  C = 0,
  D,
  E
};

int main ()
{
    printf("%d\n", A);
    printf("%d\n", B);
    printf("%d\n", C);
    printf("%d\n", D);
    printf("%d\n", E);
    return 0;
}

上述程序的输出是:

0
1
0
1
2

我能想到的唯一“陷阱”是,如果您希望多个enum名称表示相同的值,您应该记住将它们贴在您别名的项目旁边,或者放在enum列表的底部。我更喜欢后者,所以我可以计算enum行数来预测enum值是什么。

enum {
    A,
    B,
    E,

    /* aliases below */
    C = A,
    D = B
};

否则,枚举器就像int文字一样。

于 2012-07-09T15:45:16.977 回答
5

我认为这将取决于您对类型的使用。

不提供enum初始化程序的优点:

  • 在开发过程中更容易添加和删除值。
  • 您不会意外定义具有相同值的两个标识符。

提供enum初始化程序的优点:

  • 安全地序列化和反序列化数据。如果您需要将这些值放在文件、网络套接字等中,我会继续编写这些值。
  • 更容易查找值以进行调试。
于 2012-07-09T16:02:05.797 回答