为什么`int;`在C中编译好,但在C ++中编译不好?

考虑以下程序(请参阅此处的实时演示)。

#include <stdio.h> int main(void) { int ; // Missing variable name puts("Surprise"); } 

我的编译器,gcc 4.8.1,给出了下面的警告:

[Warning]空声明中无用的types名称[默认启用]

为什么编译好? 我不应该得到一个编译器错误? 当我编译为C ++程序时,g ++ 4.8.1给出了以下错误:

[错误]声明不声明任何[-fpermissive]

C标准说

除了static_assert声明之外的声明应该至less声明一个声明符(函数的参数或结构或联合的成员除外),标记或枚举的成员。

C ++说

在一个简单声明中,只有在声明一个类(第9章)或枚举时,才可以省略可选的init-declarator-list。

任何一种语言的违反都需要诊断。 标准不讨论编译器错误或警告。 警告是诊断。

您的代码在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 

请注意, 声明指定符是recursion定义的,但每个都带有一个选项,表示它是可选的。

另外,以下第6条规定:

声明说明符由一系列说明符组成,它们指示链接,存储持续时间以及声明符表示的实体的部分types。 initdeclarator-list是一个逗号分隔的声明符序列,每个序列可以有附加的types信息,或者初始化器,或者两者都有。 声明符包含正在声明的标识符(如果有的话)

请注意, 如果有的话。