为什么' int; '在C语言中可以很好地编译,但在c++中却不能
Why does `int ;` compile fine in C, but not in C++?
考虑下面的程序(参见这里的实时演示)。
#include <stdio.h>
int main(void)
{
int ; // Missing variable name
puts("Surprise");
}
我的编译器,gcc 4.8.1,给出以下警告:
[警告]空声明中无用的类型名称[默认启用]
为什么编译得很好?我不应该得到一个编译错误吗?当我把它编译成c++程序时,g++ 4.8.1给出了以下错误:
[Error]声明没有声明任何东西[-fpermissive]
C标准规定
c++说除static_assert声明以外的声明至少应声明一个声明符(函数的形参、结构体或联合的成员除外)、一个标记或枚举的成员。
在这两种语言中,违反在简单声明中,可选的init-declarator-list只有在声明类(第9条)或枚举时才能省略。
都需要进行诊断。这些标准不讨论编译器错误或警告。
您的代码在C和c++中都是非法的(即错误的,格式不良的,违反约束的)。你在一种语言中得到"警告"而在另一种语言中得到"错误"的原因只是你的编译器和编译器设置的一个怪癖。毕竟,这两种语言都没有真正形式上区分"警告"answers"错误"。在默认设置下的GCC恰好在C模式下更宽松(主要是由于历史原因)。
在GCC中使用-pedantic-errors
,你也会在C代码中得到一个"错误"。(注意,-pedantic-errors
并不是简单地盲目地把所有的"警告"变成"错误"。它尝试只报告实际的约束违反作为"错误"。)
声明的语法定义为(省略init-declarator-list和init-declarator):
6.7声明注意声明说明符是递归定义的,但是每个带有opt的声明说明符表示它是可选的。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
同样,下面的第6条规定:
声明说明符由一系列指示链接的说明符组成,存储持续时间,以及声明符表示的实体类型的一部分。initdeclarator-list是一个用逗号分隔的声明器序列,每个声明器都可以有附加的类型信息,或者一个初始化器,或者两者都有。声明符包含被声明的标识符(如果有的话)。
如果有,请注意。
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 在Visual Studio中使用括号时编译错误,但在G ++ / CLang ++中传递
- 带有引用的std::tuple在clang中编译失败,但在gcc中编译失败
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 我有一个C++函数,它在Dev C++中编译,但在G++中不编译
- Lua :在原生lua中编译,但在使用LuaJIT和sol2时C++出错
- 分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- C++代码编译,但在 Zorin OS 上运行时显示错误
- 为什么在编译过程中尽管有 -I(破折号大写 i)标志,但仍会出现未定义的引用错误?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- Cmake Mac OSX库链接问题:在Linux上进行编译,但在Mac上进行了编译
- cmake cuda在Windows上单独的编译静态LIB链接错误,但在Ubuntu上没有
- strcpy 在 Windows 上编译,但在 Linux 上不编译
- 在 Windows 上编译错误 C2131 和 C3863,但在 Linux 上不编译错误
- 相同的代码在 Dev C++ 上编译,但在 Visual Studio 2017 上不编译
- 我正在尝试编写一个函数来计算C++数字的数字根,但在编译后出现错误
- CPP 文件运行,但在编译为 exe 时不起作用