类声明大括号后的分号

新手上路,请多包涵

在 C++ 类中,为什么在右大括号后面加上分号?我经常忘记它并得到编译器错误,因此浪费了时间。对我来说似乎有些多余,这不太可能。人们真的会做这样的事情吗:

 class MyClass
{
.
.
.
} MyInstance;

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

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

原文由 SmacL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

是的,人们确实做了你刚才放在那里的声明。它对于在方法内部创建作用域类型很有用。

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

  struct ADifferentType { int x; };
}

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

原文由 JaredPar 发布,翻译遵循 CC BY-SA 2.5 许可协议

@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 */
}

原文由 Nathan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题