尾随逗号和C ++

时间:2011-06-16 13:28:28

标签: c++ c

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

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

4 个答案:

答案 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 ++版本中。