[英]Why does `int ;` compile fine in C, but not in C++?
考慮以下程序(請參閱此處的現場演示)。
#include <stdio.h>
int main(void)
{
int ; // Missing variable name
puts("Surprise");
}
我的編譯器 gcc 4.8.1 給出以下警告:
[警告] 空聲明中無用的類型名稱 [默認啟用]
為什么它編譯得很好? 我不應該得到編譯器錯誤嗎? 當我將 g++ 4.8.1 編譯為 C++ 程序時,會出現以下錯誤:
[錯誤] 聲明未聲明任何內容 [-fpermissive]
C標准說
除了 static_assert 聲明之外的聲明應至少聲明一個聲明符(函數的參數或結構或聯合的成員除外)、標簽或枚舉的成員。
C++ 說
在簡單聲明中,可選的 init-declarator-list 只有在聲明類(第 9 條)或枚舉時才能省略。
在任何一種語言中違反這一點都需要進行診斷。 這些標准不討論編譯器錯誤或警告。 警告是一種診斷。
您的代碼在 C 和 C++ 中都是非法的(即錯誤的、格式錯誤的、違反約束的)。 您在一種語言中收到“警告”而在另一種語言中收到“錯誤”的原因只是您的編譯器和編譯器設置的怪癖。 畢竟,兩種語言都沒有真正正式區分“警告”和“錯誤”。 GCC 在其默認設置下恰好在 C 模式下更寬容(主要是出於歷史原因)。
在 GCC 中使用-pedantic-errors
,你也會在 C 代碼中得到一個“錯誤”。 (請注意, -pedantic-errors
不會簡單地將所有“警告”變成“錯誤”。它試圖僅將實際的約束違規報告為“錯誤”。)
聲明的語法定義為(省略init-declarator-list和init-declarator ):
C11 6.7 聲明
declaration: declaration-specifiers init-declarator-list opt ; static_assert-declaration declaration-specifiers: storage-class-specifier declaration-specifiers opt type-specifier declaration-specifiers opt type-qualifier declaration-specifiers opt function-specifier declaration-specifiers opt alignment-specifier declaration-specifiers opt
請注意,聲明說明符是遞歸定義的,但每個都有一個opt表示它是可選的。
此外,以下第 6 條規定:
聲明說明符由一系列說明符組成,這些說明符指示鏈接、存儲持續時間和聲明符所表示的實體類型的一部分。 initdeclarator-list 是一個逗號分隔的聲明符序列,每個聲明符都可能有額外的類型信息,或初始化器,或兩者兼而有之。 聲明符包含被聲明的標識符(如果有的話) 。
如果有的話,記下這些詞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.