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

Des*_*tor 57 c c++ gcc variable-declaration language-lawyer

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

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

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

[警告]空声明中无用的类型名称[默认启用]

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

[错误]声明没有声明任何内容[-fpermissive]

n. *_* m. 48

C标准说

除static_assert声明之外的声明应至少声明声明符(除函数的参数或结构或联合的成员之外),标记或枚举的成员.

C++说

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

任何一种语言都违反此要求进行诊断.标准不讨论编译器错误或警告.警告是诊断.

  • @tepples不,标准只需要诊断.它不要求(但允许)拒绝无效程序. (4认同)

AnT*_*AnT 34

您的代码在C和C++中都是非法的(即错误的,格式错误的,违反约束的).您在一种语言中获得"警告"而在另一种语言中获得"错误"的原因只是编译器和编译器设置的一个怪癖.毕竟,这两种语言都没有真正正式区分"警告"和"错误".GCC在其默认设置下恰好在C模式下更加宽松(主要是出于历史原因).

-pedantic-errors在GCC中使用,你也会在C代码中得到"错误".(注意,-pedantic-errors不要盲目地将所有"警告"变成"错误".它会尝试仅将实际约束违规报告为"错误".)


Yu *_*Hao 18

声明的语法定义为(省略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
Run Code Online (Sandbox Code Playgroud)

请注意,声明说明符是递归定义的,但每个都带有opt表示它是可选的.

此外,以下第6条规定:

声明说明符由一系列说明符组成,这些说明符指示声明符所表示的实体的链接,存储持续时间和部分类型.initdeclarator-list是一个以逗号分隔的声明符序列,每个声明符都可以包含其他类型信息,或初始值设定项,或两者兼而有之.声明符包含声明的标识符(如果有).

注意单词,如果有的话.