2012-07-09 38 views
2

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

回答

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文字一样。

+0

好的,但用你的最后一句:不,它不是'const int'。它不是一个对象,没有地址,并且是一个编译时常量整型表达式。 – 2012-07-09 16:24:39

+0

@JensGustedt:'const int'来自于我引用的标准段落,它所说的“类型为”int“的常量”,但你说得对,我误解了它。我编辑了句子,问候 – jxh 2012-07-09 16:29:42

相关问题