C/C++枚举类型为什么要从0开始?

3
我知道的标准规定,如果您不指定枚举的第一个元素值,则枚举的初始值将默认为0
但是在Linux内核源代码中,我遇到了很多奇怪的声明。例如numa_faults_stats:
enum numa_faults_stats {
    NUMA_MEM = 0,
    NUMA_CPU,
    NUMA_MEMBUF,
    NUMA_CPUBUF
};

这个枚举中明确设置第一个元素为 0 的必要性是什么?

相关文章


7
有些程序员喜欢表达得更明确,没有其他原因。 - undefined
2
在C和C++中,零是默认值,所以没有任何区别。我猜有些人只是喜欢更明确一些。 - undefined
1
这是一个典型的案例,我在代码审查中会提到的一些事情。"你为什么在这里写了0?如果你能给出一个合理的理由,你可以保留代码不变。"但他们无法给出合理的理由。和类似愚蠢的东西一样,比如return (0);或者int x = {0};。写这种多余的东西几乎总是表明一个不安全的程序员对语言的工作原理并不十分确定。 - undefined
2个回答

4

您可以无需关心枚举的值,只使用它与其他枚举进行比较。但有时候它的值是很重要的。例如,您可以将其用作数组的索引。

 struct NUMA Numa[N];
 Numa[NUMA_MEM];
 Numa[NUMA_CPU];

在这种情况下,明确指定默认相等的值是一个绝对好主意。这样做可以强调它在代码中具有使用价值。

确实,这是我也遵循的一种约定(例如C++03元编程技术)。而且这样的代码总是需要有注释。 - undefined
是的,这是正确的答案:在乎初始化器的时候使用它们。如果你不关心具体的值是什么,只要它们不同,就没有必要明确地声明这些值是什么。+1。 - undefined
1
这样的代码应该被写成 enum { NUMA_MEM, ... NUMA_N }; 然后 struct NUMA Numa[NUMA_N];。可以选择加上 static_assert(sizeof Numa/*sizeof Numa == NUMA_N, "The enum is crap."); - undefined
我不同意。即使枚举的值很重要,只需快速查看枚举定义就足以知道第一个成员是零。在我看来,当我看到第一个枚举成员前面有零时,会感到困惑! - undefined

3

C语言和C++有很多规则,这是其中之一。有时候为了清晰明了,显式地表达是件好事。

另一个常见的规则是在函数原型中使用变量名(只需要类型即可)。另一个是在任一语言中的main中使用return 0;。在C++的classstruct中明确使用publicprivate也是如此。


我还要补充的是,它也可以在这里消除认知失调。当有人重构代码以摆脱魔法数字或者只是需要了解默认值时,明确看到哪个是0值是很有用的。 - undefined
@Bathsheba,我非常尊重地不同意你的观点。在函数原型中使用变量名对于文档编写是有好处的,而且这些变量名是无法猜测的(以及它们可能的用途)。但是零是一个容易记住的数字,而且将零作为枚举的第一个成员是每个优秀的C/C++程序员都应该知道的规则。我认为这两者并不可比较。至于明确使用public/private的情况,我有些同意你的观点。但同样,我认为这也不可比较。不管怎样,还是谢谢你的回答。我真的开始相信背后有一个真正的逻辑原因了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接