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