Joe*_*l B 5 c compiler-construction enums explicit declaration
我之前听说过,如果我没有做一些聪明的事情,比如将值用作位掩码,我应该让编译器选择为枚举常量指定哪些值.如果我只是使用枚举值来获得更明确的代码文档,那么如果我没有明确定义所有值,是否会出现任何陷阱?我相信值是按升序分配的.我应该定义第一个值以确保每个连续编译的值相同吗?
从C99,第6.7.2.2p3节:
枚举器列表中的标识符声明为具有int类型的常量,并且可以出现在允许的位置.带=的枚举器将其枚举常量定义为常量表达式的值.如果第一个枚举数没有=,则其枚举常量的值为0.每个后续的带有no的枚举数将其枚举常量定义为通过将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;
}
Run Code Online (Sandbox Code Playgroud)
上述程序的输出是:
0
1
0
1
2
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一"问题"是,如果你想要多个enum名字代表相同的值,你应该记住要么将它们贴在你别名的项目旁边,要么在enum列表的底部.我更喜欢后者,所以我可以计算enum线来预测enum价值.
enum {
A,
B,
E,
/* aliases below */
C = A,
D = B
};
Run Code Online (Sandbox Code Playgroud)
否则,枚举器就像一个int文字.
我认为这将取决于您使用的类型。
不提供enum初始化程序的优点:
提供enum初始化程序的优点: