尾随逗号和C ++

我在某处读到C ++标准不允许像enum an_enum { a, b, c, }; 虽然C的后期版本(我认为从90年代中期开始)确实允许使用尾随逗号进行此类声明。 如果C ++应该与C具有向后兼容性,那么为什么禁止使用此function呢? 任何特殊原因?

我还读到这样的尾随逗号实际上是好的,所以这只会增加混乱。

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)在你想要在开始时添加新值的情况下(在这种情况下很少见)并没有帮助。

查看C ++ 0x的最新草案,看起来您可以使用尾随逗号:

 enum-specifier: enum-head { enumerator-list opt} enum-head { enumerator-list , } enumerator-list: enumerator-definition enumerator-list , enumerator-definition 

首先,最后一个C标准是1999年。最后一个(完整的)C ++标准是98(2003年是一个更新)。 在那之后,并非所有C99都进入C ++ 11。

枚举中的尾随逗号在C99中作为一项function引入。 它不存在于基于C99之前基线的C90或C ++版本中。