分号后的分号括号

时间:2009-04-24 12:47:33

标签: c++ class oop declaration

在C ++类中,为什么闭括号后的分号?我经常忘记它并得到编译器错误,因而浪费时间。对我来说似乎有些多余,这种情况不太可能发生。人们真的做的事情如下:

class MyClass
{
.
.
.
} MyInstance;

我从结构和枚举的C兼容性角度得到它,但由于类不是C语言的一部分,我想主要是在类似的声明结构之间保持一致性。

我想要的是与设计原理更相关,而不是能够改变任何东西,尽管一个好的代码完成IDE可能会在编译之前捕获它。

7 个答案:

答案 0 :(得分:54)

@MichaelHaren提供的link似乎提供根本原因。分号(正如其他人指出的那样)是从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 */
} 

答案 1 :(得分:42)

语言需要类型声明中右括号后的分号。从最早的C版开始就是这样。

是的,人们确实做了你刚刚提出的声明。它对于在方法内创建范围类型很有用。

void Example() {
  struct { int x; } s1;
  s1.x = 42;

  struct ADifferentType { int x; };
}

在这种情况下,我认为很清楚为什么需要分号。至于为什么在头文件中声明的更一般情况下需要它,我不确定。我的 guess 是它的历史,并且是为了让编写编译器更容易。

答案 2 :(得分:15)

我想这是因为类是声明,即使它们需要大括号进行分组。是的,有一个历史论点,因为在C中你可以做到

struct
{
  float x;
  float y;
} point;

你应该在C ++中能够做类似的事情,class声明以相同的方式行事是有道理的。

答案 3 :(得分:8)

这是

的缩写
class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

类声明的花括号之后的分号实际上是矫枉过正,但它是如何定义C ++的。变量声明后的分号总是需要的并且有意义。

答案 4 :(得分:3)

我不使用此类声明

class MyClass
{
.
.
.
} MyInstance;

但在这种情况下,我可以理解为什么有分号 因为它就像int a; - 变量声明。

可能因为你可以省略'MyInstance'分号而保持一致。

答案 5 :(得分:3)

出于兼容性原因需要在struct之后,以及您希望如何:

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency

答案 6 :(得分:3)

在C / C ++中;是一个声明终结者。 所有陈述均以终止;避免歧义(并简化解析)。 语法在这方面是一致的。 即使是类声明(或任何块) 是多行长而且是 用{}分隔它仍然只是一个语句({}是语句的一部分) 因此需要终止; (;不是分隔符/分隔符)

在你的例子中

class MyClass{...} MyInstance;

是完整的陈述。 可以在单个语句中定义声明的类的多个实例

class MyClass{...} MyInstance1, MyInstance2;

这与在单个语句中声明基本类型的多个实例完全一致:

int a, b, c;

一个人不经常看到类和实例的这种说法的原因,实例可能吗?只有?是一个全局变量,除非它们是静态和/或普通旧数据结构,否则你实际上并不经常需要全局对象。