为什么' int; '在C语言中可以很好地编译,但在c++中却不能

Why does `int ;` compile fine in C, but not in C++?

本文关键字:但在 编译 不能 c++ int 语言 为什么 很好      更新时间:2023-10-16

考虑下面的程序(参见这里的实时演示)。

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

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

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

为什么编译得很好?我不应该得到一个编译错误吗?当我把它编译成c++程序时,g++ 4.8.1给出了以下错误:

[Error]声明没有声明任何东西[-fpermissive]

C标准规定

除static_assert声明以外的声明至少应声明一个声明符(函数的形参、结构体或联合的成员除外)、一个标记或枚举的成员。

c++说

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

在这两种语言中,违反

都需要进行诊断。这些标准不讨论编译器错误或警告。

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

在GCC中使用-pedantic-errors,你也会在C代码中得到一个"错误"。(注意,-pedantic-errors并不是简单地盲目地把所有的"警告"变成"错误"。它尝试只报告实际的约束违反作为"错误"。)

声明的语法定义为(省略init-declarator-listinit-declarator):

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是一个用逗号分隔的声明器序列,每个声明器都可以有附加的类型信息,或者一个初始化器,或者两者都有。声明符包含被声明的标识符(如果有的话)

如果有,请注意

相关文章: