簡體   English   中英

為什么 `int ;` 在 C 中編譯得很好,但在 C++ 中卻不行?

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

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