我应该明确定义我的枚举常量值

时间:2012-07-09 15:38:58

标签: c compiler-construction enums declaration explicit

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

2 个答案:

答案 0 :(得分:6)

从C99,第6.7.2.2p3节:

  

枚举器列表中的标识符声明为类型为int和的常量   可能出现在允许的任何地方。带=的枚举数定义了它   枚举常量作为常量表达式的值。如果第一个调查员有   no =,其枚举常量的值为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字面值。

答案 1 :(得分:5)

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

不提供enum初始值设定项的优点:

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

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

  • 安全地序列化和反序列化数据。如果您需要将这些值放在文件,网络套接字等中,我会继续写下值。
  • 更容易查看值以进行调试。