我以前听说过,我应该让编译器选择为枚举常量分配哪些值,如果我没有做一些聪明的事情,比如使用值作为位掩码。如果我只是使用枚举值来获得更加明确的代码文档,那么如果我没有明确定义所有的值,是否有任何陷入困境的陷阱?我相信价值是按升序分配的。我应该定义第一个值以确保每个连续编译的值相同吗?我应该明确定义值我的枚举常量
2
A
回答
4
我认为这将取决于你使用的类型。
优势不提供enum
初始化:
- 轻松地添加和为您开发删除值。
- 您不会意外地定义两个具有相同值的标识符。
优势提供enum
初始化:
- 安全序列化和反序列化的数据。如果您需要将这些值放入文件,网络套接字等,我会继续写下值。
- 更容易查看值以进行调试。
5
从C99,第6.7.2.2p3:
在枚举列表中的标识符被声明为具有类型int和 可能会出现这样的被允许的地方常数。具有=的枚举器将其枚举常量 定义为常量表达式的值。如果第一个枚举数为 no =,则枚举常量的值为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;
}
的输出上面的程序是:
唯一的“疑难杂症”,我能想到的是,如果你想多enum
名表示相同的值,你要记得或者将它们粘在您别名的项目旁边,或者放在enum
列表的底部。我更喜欢后者,所以我可以计算enum
行来预测enum
值是什么。
enum {
A,
B,
E,
/* aliases below */
C = A,
D = B
};
否则,枚举器就像int
文字一样。
相关问题
- 1. 我应该在哪里定义枚举?
- 2. 我是否应该明确指定超类和Swift中枚举的起始值
- 3. 应该将映射值声明为常量还是枚举?
- 4. 我应该在哪里定义我的枚举?
- 5. 声明常量枚举
- 6. 我应该如何格式化我的.txt枚举值?
- 7. 我应该定义自定义的枚举器还是使用内置的枚举器?
- 8. 枚举声明和定义
- 9. 定义枚举常量身体JCodeModel
- 10. 应该在哪里定义枚举?
- 11. 接口是否应该定义实现特定的枚举值?
- 12. Java自定义枚举值枚举
- 13. 我不明白PlatformID枚举
- 14. 这EntitySetRights枚举我应该使用
- 15. WCF客户端在明确定义枚举值时失败
- 16. 枚举常量
- 17. 为什么我应该在顶层声明枚举?
- 18. 我应该将枚举ID /值存储在数据库还是C#枚举中?
- 19. 我应该用在那里,我需要他们的内在价值枚举或只是单独的常量
- 20. 我应该明确trunc?
- 21. PHP未定义的变量,应该明确定义
- 22. 枚举与该枚举值赋给
- 23. 我应该重写Enum.toString()来定位一个枚举的标签?
- 24. ngGrid单元格值是一个枚举值,我该如何使用枚举名?
- 25. 枚举和常量
- 26. 我应该将参考表值作为枚举存储吗?
- 27. 我在一个枚举变量中设置三个枚举常量,有没有办法从枚举变量中检索枚举常量作为数组?
- 28. 我应该明确地宣布我的变量在VB6
- 29. 我应该创建traits来表示我的模型的枚举值吗?
- 30. 个人枚举定义功能常数我班
好的,但用你的最后一句:不,它不是'const int'。它不是一个对象,没有地址,并且是一个编译时常量整型表达式。 – 2012-07-09 16:24:39
@JensGustedt:'const int'来自于我引用的标准段落,它所说的“类型为”int“的常量”,但你说得对,我误解了它。我编辑了句子,问候 – jxh 2012-07-09 16:29:42