我在某处读过C ++标准不允许像enum an_enum { a, b, c, };
这样的东西,而C的后期版本(我认为从90年代中期开始)确实允许使用尾随逗号进行此类声明。如果C ++应该与C具有向后兼容性,那么为什么禁止使用此功能呢?有什么特别的原因吗?
我还读到这样的尾随逗号实际上是好的,所以这只会增加混乱。
答案 0 :(得分:54)
C ++ 03(这是C ++ 98的一个相当小的更新)基于C89的C兼容性(也称为C90,取决于您是ANSI还是ISO)。 C89不允许使用尾随逗号。 C99确实允许它。 C ++ 11允许它(7.2 / 1具有枚举声明的语法)。
事实上,即使使用C89,C ++也不是完全向后兼容的,尽管如果它存在于C89中,你会期望C ++允许它。
尾随逗号的关键优势在于你写这个:
enum Channel {
RED,
GREEN,
BLUE,
};
然后将其更改为:
enum Channel {
RED,
GREEN,
BLUE,
ALPHA,
};
当您diff
版本时,只更改了一行是很好的。要在没有允许尾随逗号的情况下获得相同的效果,您可以写:
enum Channel {
RED
,GREEN
,BLUE
};
但是(a)这是疯狂的谈话,而且(b)在你想要在开头添加新值的情况下(在这种情况下很少见)并没有帮助。
答案 1 :(得分:6)
查看C ++ 0x的最新草稿,看起来您可以使用尾随逗号:
enum-specifier:
enum-head { enumerator-list opt}
enum-head { enumerator-list , }
enumerator-list:
enumerator-definition
enumerator-list , enumerator-definition
答案 2 :(得分:1)
首先,最后一个C标准是在1999年。最后一个(完整的)C ++标准是98(2003年是一个更新)。 之后,并非所有C99都进入C ++ 11。
答案 3 :(得分:1)
枚举中的尾随逗号是作为一项功能在C99中引入的。它不存在于基于C99之前基线的C90和C ++版本中。