尾随逗号和C++

Loc*_*ead 34 c c++

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

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

Ste*_*sop 60

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,
};
Run Code Online (Sandbox Code Playgroud)

然后将其更改为:

enum Channel {
    RED,
    GREEN,
    BLUE,
    ALPHA,
};
Run Code Online (Sandbox Code Playgroud)

很高兴diff在版本中只更改一行.要在没有允许尾随逗号的情况下获得相同的效果,您可以编写:

enum Channel {
    RED
   ,GREEN
   ,BLUE
};
Run Code Online (Sandbox Code Playgroud)

但是(a)这是疯狂的谈话,而且(b)它在你想要在开始时添加新值的(不可否认的罕见)情况中没有帮助.

  • `,GREEN`看起来像一个lisp宏替换... ;-) (3认同)

小智 6

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

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

enumerator-list:
enumerator-definition
enumerator-list , enumerator-definition
Run Code Online (Sandbox Code Playgroud)