C++ Semicolon课后,struct,enum,......没用但编译器仍会发出错误?

Val*_*ond 5 c++ compiler-construction

可能重复:
在C++类中,为什么在结束括号后的分号

这是我一直想知道的事情,为什么你必须在c ++的类,结构或枚举的结束括号后面加一个分号?

更糟糕的(或实际问题),为什么编译器在发出警告时会发出错误?

将分号放在那里是否真的很重要,为什么?

Ida*_*rye 10

它是C的遗留物.您可以在cladd/struct/enum声明之后声明变量.代码:

class A{};
A a;
Run Code Online (Sandbox Code Playgroud)

与以下相同:

class A{} a;
Run Code Online (Sandbox Code Playgroud)

编译器需要;知道你不想在类声明后声明变量.


Naw*_*waz 8

将分号放在那里是否真的很重要,为什么?

是.这可能有用.

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

struct A
{
  //members
} obj;
Run Code Online (Sandbox Code Playgroud)

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  
Run Code Online (Sandbox Code Playgroud)

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

最重要的是,无论您如何声明对象,无论它们的类型是什么,均匀地声明对象后都会添加分号.

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

 typedef int my_int;
 typedef std::string my_string;
 typedef struct {int x,y,z;} my_point;
Run Code Online (Sandbox Code Playgroud)

现在,所有的这些my_int,my_stringmy_point有型.

但是当你不同时做任何事情(即既没有声明对象,也没有定义typedef),那么你只需要留下这样的空白,没有任何声明/定义.但值得注意的是,它一直为您提供有趣且实用的功能.