有人向我指出,我有什麼樣子的一些C++代碼一個錯字:C++,尾隨逗號不是一個錯誤,會發生什麼? Foo x,y ,;;
protected:
Foo x, y,;
我還以爲後面的逗號將是一個錯誤,但顯然它不是?這是不明確的,或者會發生什麼?大概是壞事,因爲代碼檢查程序對此抱怨。
有人向我指出,我有什麼樣子的一些C++代碼一個錯字:C++,尾隨逗號不是一個錯誤,會發生什麼? Foo x,y ,;;
protected:
Foo x, y,;
我還以爲後面的逗號將是一個錯誤,但顯然它不是?這是不明確的,或者會發生什麼?大概是壞事,因爲代碼檢查程序對此抱怨。
相關的語法產量在9.2節:
member-declarator-list:
member-declarator
member-declarator-list , 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添加的,以簡化編寫源代碼生成器。 (最經常得到這個工作的預處理器,即使有這麼簡單的需求,仍然很困難。)通常,一個簡單的生成器可能會避免使用多個名稱來創建聲明,因爲由於語法複雜,這是一堆蠕蟲。另一方面,允許由;
組成的空聲明,就像成員函數定義之後的分號一樣。
你也可以發佈成員聲明器嗎? – Pubby 2013-02-12 09:17:45
@Pubby問,你會收到...但它只是引用了一堆其他高級構造。 – Potatoswatter 2013-02-12 09:20:07
* init-declarator-list *的語法類似於允許尾隨逗號,但GCC不會編譯尾隨逗號。 – Nawaz 2013-02-12 09:22:33
我的意見
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:
他們都犯錯誤
可能是一個編譯器擴展 - 您使用哪種編譯器? – Angew 2013-02-12 09:11:00
雖然逗號可能是錯誤的。 – 2013-02-12 09:11:45
這是爲了使代碼生成更容易。懷疑它是標準的。 – Pubby 2013-02-12 09:17:28