【问题标题】:Program without semicolon compiles fine in C not in C++ why?没有分号的程序在 C 中编译得很好而不是在 C++ 中为什么?
【发布时间】:2015-05-05 12:11:18
【问题描述】:

我正在使用 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;
}

[警告] struct 或 union 末尾没有分号 [默认启用]

// 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;
}

[错误] 应为 ';'在成员声明的末尾

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

错误:结构或联合末尾没有分号。

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

【问题讨论】:

  • 你在问为什么不同的语言有不同的规则吗?还是您要求我们为您阅读语言规范,以查找每种语言的相关规则?
  • @MikeSeymour:那么,两种语言的规则都不同吗?什么语言规范说明了它?
  • @meet 您有兴趣了解这两种语言的语法吗?如果是,请在您的问题中添加此内容。要具体并保持你的问题客观。
  • 您误解了编译器告诉您的内容。 “警告”并不意味着“您的程序很好”。这意味着“您的程序有问题,继续自担风险”。

标签: c++ c syntax


【解决方案1】:

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

struct-declaration:
    specifier-qualifier-list struct-declarator-list ;

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

member-declaration:
    attribute-specifier-seq<opt> decl-specifier-seq<opt> member-declarator-list<opt> ;

两者都需要以分号结尾。

您必须询问编译器编写者为什么他们的 C++ 编译器比 C 编译器更严格。请注意,语言规范仅在程序格式错误时才需要“诊断”,因此发出警告并像分号一样继续编译或发出错误并停止是合法的。

您的 IDE 似乎使用 GCC 作为其编译器;在这种情况下,如果您希望进行更严格的诊断,您可以使用 -Werror 将警告转换为错误。

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 2016-01-21
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多