没有分号的程序在C中编译好而不是在C++中为什么?

Des*_*tor 6 c c++ syntax

我正在使用Orwell Dev C++ IDE.最近我测试了以下简单的程序,其中我忘了放分号(;)但它仍然在C中编译好但在C++中没编译.为什么?是什么原因?

// C program compiles & runs fine, even ; missing at end of struct
#include <stdio.h>
struct test
{ int a,b};     // missing semicolon
int main()
{
    struct test d={3,6};
    printf("%d",d.a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

[警告]结构或联合结束时没有分号[默认启用]

// Following is compilation error in C++
#include <stdio.h>
struct test
{ int a,b};     // missing semicolon
int main()
{
    struct test d={3,6};
    printf("%d",d.a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

[错误]预期';' 在会员声明结束时

我也尝试在代码块13.12 IDE中使用相同的C程序,但它显示以下错误消息

错误:结构或联合结束时没有分号.

为什么不同的实现给出不同的错误消息?

Mik*_*our 14

两种语言都需要分号.具体而言,C指定一个或多个结构成员的声明为

struct-declaration:
    specifier-qualifier-list struct-declarator-list ;
Run Code Online (Sandbox Code Playgroud)

和C++指定一个或多个类成员变量的声明

member-declaration:
    attribute-specifier-seq<opt> decl-specifier-seq<opt> member-declarator-list<opt> ;
Run Code Online (Sandbox Code Playgroud)

两者都需要一个分号.

你必须要求编译器编写者为什么他们的C++编译器比他们的C编译器更严格.请注意,如果程序格式错误,语言规范只需要"诊断",因此发出警告并继续编译就像分号存在一样,或者发出错误并停止是合法的.

看起来您的IDE使用GCC作为其编译器; 在这种情况下-Werror,如果您更喜欢更严格的诊断,可以使用将警告转换为错误.