[英]c++, how is trailing comma not an error and what happens? 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:
他們倆都犯了錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.