3

有人向我指出,我在某些 c++ 代码中出现了一个错字:

protected:
    Foo  x, y,;

我会认为结尾的逗号会是一个错误,但显然不是吗?这是未定义的,还是发生了什么?大概是坏事,因为代码检查程序抱怨它。

4

2 回答 2

6

相关的语法产生在 §9.2 中:

member-declarator-list:
  member-declarator
  member-declarator-list , member-declarator

逗号只允许分隔声明符(名称)。member-declarator本身可能不包含逗号。

编辑:这里是成员声明器……它不是完全独立的,声明器的语法通常是蜘蛛网。

member-declarator:
  declarator virt-specifier-seq(opt) pure-specifier(opt)
  declarator brace-or-equal-initializer(opt)
  identifier(opt) attribute-specifier-seq(opt) : constant-expression

不正确的语法不是未定义的行为;允许放错逗号的编译器有一个错误。拒绝这种事情是标准的要求。

请注意,枚举定义和大括号初始化器中允许使用尾随逗号。我认为这两种情况都是由 C++11 添加的,以简化编写源代码生成器。(最常得到这项工作的预处理器即使有如此简单的要求也很难。)通常,简单的生成器可能会避免创建具有多个名称的声明,因为由于语法复杂,它是一罐蠕虫。另一方面,;允许使用由 组成的空声明,如成员函数定义后的分号。

于 2013-02-12T09:16:40.603 回答
1

我的观察

GCC 4.6.2:

void myFunc()
{
  int x, y, ; // <-- Syntax error
}

class MyClass
{
  int x, y,; // <-- No error (one extra comma) but last comma is ignored
};

MSVC 2008:

他们都犯了错误

OpenWatcom 1.8:

他们都犯了错误

于 2013-02-12T09:23:02.473 回答