簡體   English   中英

c ++,尾隨逗號怎么不是錯誤,會發生什么? Foo x,y ,;

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM