类、结构、枚举等后面的C++分号,..无用,但编译器仍然会发出错误

C++ Semicolon after class, struct, enum,... useless but compilers still emit errors?

本文关键字:编译器 错误 出错 无用 分号 枚举 结构 C++      更新时间:2023-10-16

可能重复:
在C++类中,为什么在右大括号后面使用分号

这是我很长一段时间以来一直想知道的事情,为什么你必须在c++中的类、结构或枚举的右括号后面放一个分号?

更糟糕的是(或者说实际的问题(,当编译器可以简单地发出警告时,为什么会发出错误?

把分号放在那里真的很重要吗?如果,为什么?

它是C的剩余部分。您可以在cladd/struct/enum声明之后声明变量。代码:

class A{};
A a;

与相同

class A{} a;

编译器需要;知道您不想在类声明之后声明变量。

把分号放在那里真的很重要吗?如果,为什么?

是的。这有时会很有用。

您可以定义一个结构,并可以将对象声明为:

struct A
{
  //members
} obj;

obj是一个类型为A的对象,您可以如上所示声明它。这和在声明变量后加分号的方式是一样的,比如:

int i;                      //declares i of type int
std::string s;              //declares s of type std::string
struct {int x,y,z;} point;  //declares point of an unnamed struct type  

在这里,前两个声明看起来非常熟悉,但最后一个声明看起来有点陌生,因为它定义了一个未命名的结构,同时声明了该未命名结构的一个名为point的对象。

底线是,无论您如何声明对象,无论它们的类型是什么,都要在统一声明对象后放一个分号。

不仅如此,您甚至可以以统一的方式typedef

 typedef int my_int;
 typedef std::string my_string;
 typedef struct {int x,y,z;} my_point;

现在所有这些my_intmy_stringmy_point都是类型。

但是,当你既不做这两件事(即既不声明对象,也不定义typedef(时,你只需将这个地方留空,没有任何声明/定义。但需要注意的是,它始终为您提供了一个有趣且有用的功能。

类、结构和枚举的定义就是定义。C++中的定义和C中的定义一样,必须以分号结束。如果你不把它放进去,就会有很多歧义:

struct X
{
}   //no ;
foo()  //no return value
{
}

它被读取为返回结构的函数foo,而不是返回(已提交(整数的结构和函数。这是有效的C,但不是C++。

int *x;
void foo()
{
    struct S { }  //no ;
    *x = 3;  // <--- what is this?
}

第二个x是类型为pointer-to-S的局部变量,还是对全局x的引用?你根本说不出来。

还有很多其他的例子,如果你尝试的话,你可能会想到一些。

为什么在c++中,类、结构或枚举的右括号后面必须放一个分号?

真正的答案是,因为C++标准是这么说的。该语言的设计方式是,每个声明都必须以;结尾。

类对象可以声明为:

class MyClass
{
    //Members    
}obj;

因此,支架末端的;

更糟糕的是(或者说实际的问题(,当编译器可以简单地发出警告时,为什么会发出错误?

当编译器怀疑可能有问题或潜在危险时,它会发出警告

当程序不遵循标准制定的语法准则时,编译器会发出错误,在您提到的情况下,省略分号会违反C++标准提到的语法规则,从而导致错误。