在C ++类中,为什么在右花括号后加分号?我经常忘记它并得到编译器错误,从而浪费时间。在我看来似乎有点多余,事实并非如此。人们是否真的在做以下事情:
class MyClass
{
.
.
.
} MyInstance;
从结构和枚举的C兼容性角度来看,但是由于类不是C语言的一部分,我想它主要是在类似声明结构之间保持一致性。
我一直在寻找的是与设计原理相关的东西,而不是能够更改任何东西,尽管良好的代码完成IDE可能会在编译之前就将其捕获。
在C ++类中,为什么在右花括号后加分号?我经常忘记它并得到编译器错误,从而浪费时间。在我看来似乎有点多余,事实并非如此。人们是否真的在做以下事情:
class MyClass
{
.
.
.
} MyInstance;
从结构和枚举的C兼容性角度来看,但是由于类不是C语言的一部分,我想它主要是在类似声明结构之间保持一致性。
我一直在寻找的是与设计原理相关的东西,而不是能够更改任何东西,尽管良好的代码完成IDE可能会在编译之前就将其捕获。
Answers:
语言需要在类型声明中的右花括号后加分号。自最早的C版本以来就是这样。
是的,确实确实有人在做您刚刚在那儿张贴的声明。这对于在方法内部创建作用域类型很有用。
void Example() {
struct { int x; } s1;
s1.x = 42;
struct ADifferentType { int x; };
}
在这种情况下,我认为很清楚为什么需要分号。至于为什么在不确定的头文件中更一般的情况下需要它,我不确定。我的猜测是,这是历史悠久的,并且这样做是为了简化编译器的编写。
所述链接由@MichaelHaren提供似乎提供的根本原因。分号(如其他人所指出的)是从C继承的。但这并不能解释为什么C首先使用它。讨论包括以下示例:
struct fred { int x; long y; };
main()
{
return 0;
}
除非另外声明,否则较旧的C版本具有函数的隐式int返回类型。如果我们;
在结构定义的末尾省略,则不仅要定义新的类型fred
,还要声明main()
它将返回的实例fred
。即代码将被解析为:
struct fred { int x; long y; } main()
{
return 0; /* invalid return type, expected fred type */
}
这是短的
class MyClass
{
.
.
.
};
// instance declaration
MyClass MyInstance; // semicolon here
类声明的花括号后的分号实际上是过分的,但这就是C ++的定义方式。始终需要变量声明后的分号,这是有意义的。
在C / C ++中;是语句终止符。所有语句以;终止;以避免歧义(并简化解析)。在这方面,语法是一致的。即使一个类声明(或与此有关的任何块)长多行并用{}分隔,它仍然只是一个语句({}是该语句的一部分),因此需要以;结尾;(;不是分隔符/分隔符)
在你的例子中
class MyClass{...} MyInstance;
是完整的声明。一个人可以在一个语句中定义已声明类的多个实例
class MyClass{...} MyInstance1, MyInstance2;
这与在单个语句中声明基本类型的多个实例完全一致:
int a, b, c;
之所以不经常看到这样的类和实例的声明,是因为实例只能吗?是一个全局变量,除非它们是静态和/或普通旧数据结构,否则您实际上并不经常需要全局对象。