有人向我指出,我在某些 c++ 代码中出现了一个错字:
protected:
Foo x, y,;
我会认为结尾的逗号会是一个错误,但显然不是吗?这是未定义的,还是发生了什么?大概是坏事,因为代码检查程序抱怨它。
有人向我指出,我在某些 c++ 代码中出现了一个错字:
protected:
Foo x, y,;
我会认为结尾的逗号会是一个错误,但显然不是吗?这是未定义的,还是发生了什么?大概是坏事,因为代码检查程序抱怨它。
相关的语法产生在 §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 添加的,以简化编写源代码生成器。(最常得到这项工作的预处理器即使有如此简单的要求也很难。)通常,简单的生成器可能会避免创建具有多个名称的声明,因为由于语法复杂,它是一罐蠕虫。另一方面,;
允许使用由 组成的空声明,如成员函数定义后的分号。
我的观察
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:
他们都犯了错误