首页 文章

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

提问于
浏览
57

请考虑以下程序(请参阅现场演示here) .

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

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

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

为什么编译好?我不应该得到编译错误吗? g 4.8.1将其编译为C程序时出现以下错误:

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

3 回答

  • 18

    C标准说

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

    C说

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

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

  • 34

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

    在GCC中使用 -pedantic-errors ,您也将在C代码中获得"error" . (请注意, -pedantic-errors 不会盲目地将所有"warnings"转换为"errors" . 它会尝试仅报告实际约束违规"errors" . )

  • 48

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

    C11 6.7声明声明:
    declaration-specifiers init-declarator-list opt;
    static_assert声明
    声明-符:
    存储类说明符声明说明符选项
    type-specifier declaration-specifiers opt
    type-qualifier声明 - 说明符opt
    function-specifier declaration-specifiers opt
    alignment-specifier declaration-specifiers opt

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

    此外,以下第6条规定:

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

    注意单词,如果有的话 .

相关问题