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