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

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

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

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

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

[ERROR]声明未声明任何内容[-fpermissive]

推荐答案

C标准说

静态断言声明以外的声明应至少声明一个声明符(函数的参数或 struct 或联合的成员除外)、一个标记或枚举的成员.

C++说

在简单声明中,只有在声明类(第9条)或枚举时,才可以省略可选的init声明器列表.

在任何一种语言中违反这一点都需要诊断.这些标准没有讨论编译器错误或警告.警告是诊断.

C++相关问答推荐

了解返回函数指针的函数定义

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

错误:在.h程序中重新定义 struct

为什么已经设置的值在C中被重置为for循环条件中的新值?

返回一个包含数组的 struct

在C中使用动态内存分配找到最小的负数

增加getaddrinfo返回的IP地址数量

C:二进制搜索和二进制插入

在编译时参数化类型定义

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

每个 struct 变量在C中都有自己的命名空间吗?

为 struct 中的数组动态分配内存时出错

为什么编译器不能简单地将数据从EDI转移到EAX?

如何在zOS上编译共享C库

即使我在C++中空闲,也肯定会丢失内存

赋值两侧的后置增量,字符指针

将char*铸造为空**

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

如何使用 raylib 显示数组中的图像

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?