类、结构、枚举等后面的C++分号,..无用,但编译器仍然会发出错误
C++ Semicolon after class, struct, enum,... useless but compilers still emit errors?
可能重复:
在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_int
、my_string
和my_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++标准提到的语法规则,从而导致错误。
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 编译器错误:destuctor 的更宽松的抛出说明符
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- C++ G++ 编译器 - 错误:隐式声明的定义
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 模板模板参数和模板别名:编译器错误?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 如何在C++中克服此 C4430 编译器错误?
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- C++自定义分配器大小参数作为模板参数会引发编译器错误