可能重复:
In C++ classes, why the semi-colon after the closing brace
这是我一直想知道的事情,为什么你必须在c ++的类,结构或枚举的结束括号后加一个分号?
更糟糕(或实际问题),为什么编译器在发出警告时会发出错误?
将分号放在那里是否真的很重要,为什么?
答案 0 :(得分:10)
这是C的遗留问题。您可以在cladd / struct / enum声明之后声明变量。代码:
class A{};
A a;
与:
相同class A{} a;
编译器需要;
知道你不想在类声明后声明变量。
答案 1 :(得分:8)
将分号放在那里是否真的很重要,为什么?
是。这可能有用。
您可以定义结构,并可以将对象声明为:
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_int
,my_string
和my_point
都是类型。
但是如果你们两个都没有(即既没有声明对象,也没有定义typedef),那么你只需要留下这个空白,没有任何声明/定义。但值得注意的是,它一直为您提供有趣且实用的功能。
答案 2 :(得分:3)
类,结构和枚举定义是定义。 C ++中的定义,如在C中,必须用分号完成。 如果你不把它放在那里会有很多含糊之处:
struct X
{
} //no ;
foo() //no return value
{
}
这被读作函数foo
,它返回一个结构,而不是一个结构和一个返回(ommited)整数的函数。这是有效的C,但不是C ++。
int *x;
void foo()
{
struct S { } //no ;
*x = 3; // <--- what is this?
}
第二个x
是pointer-to-S
类型的局部变量,还是对全局x
的引用?你根本说不出来。
如果你尝试的话,还有很多其他的例子,可能你会想到一些。
答案 3 :(得分:2)
为什么你必须在c ++的类,结构或枚举的结束括号后放置一个半冒号?
真实答案,因为C ++标准是这样说的。该语言的设计方式使每个声明必须以;
结束。
类对象可以声明为:
class MyClass
{
//Members
}obj;
因此大括号末尾的;
。
更糟糕(或实际问题),为什么编译器在发出警告时会发出错误?
编译器在怀疑可能存在错误或潜在危险时会发出警告
当程序不遵循标准规定的语法指南时,编译器会发出错误,在您提到的情况下忽略了半冒号,违反了C ++标准提到的语法规则,从而导致错误。