功能后的分号

use*_*652 20 c++ syntax

是否有一个特定的原因,为什么有些人在卷曲闭合函数括号后添加分号?

void foo() {

};
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 25

不是真的,那里的分号没什么区别.这可能是一个习惯问题.

如果你想要,你可以在C++ 11中输入尽可能多的分号:

void foo() {

};;;;;;;;
Run Code Online (Sandbox Code Playgroud)

  • @LuchianGirgore:"空声明"是在C++ 11中引入的.http://stackoverflow.com/questions/4335024/grammar-of-ac-translation-unit (2认同)

AnT*_*AnT 5

他们为什么这样做可能纯粹是个人风格的问题(我补充说,这是一个相当奇怪的问题)。但这样做的合法性是完全不同的事情。在 C++14 之前的语言版本中,它取决于进行此函数定义的范围。

如果您在命名空间范围内定义这样的函数,那么尾随;与函数定义无关。在 C++98 和 C++03 中,它只是一个语法错误。C++11在命名空间范围内(但不在类范围内)引入(或“合法化”)所谓的空声明。所以,那个额外的分号只是构成一个单独的空声明,它跟在函数定义之后。这也意味着在命名空间范围内,您可以根据需要添加任意数量的多余分号。

如果您在范围内定义这样的函数,那么情况就不同了。在语言(从C ++ 98开始)的所有版本中,你一直被允许添加可选;在一流函数定义的结束。这;是函数定义的一个组成部分,语法明确允许。即在类范围内,尾随;不构成独立的空定义。这也意味着在类作用域中,您只能;在函数定义后添加一个可选项,而不能添加更多。

但是,在 C++14 中,为了解决;类方法定义中可选的一些问题,C++14 重新设计了这部分语法。现在,类内成员函数定义的语法不再包含上述可选的;. 相反,从 C++14 开始的类现在也支持空成员声明。因此,冗余的含义;现在在所有范围内都是一致的:它只是一个独立的空声明,附加在函数定义的末尾。

所以,用一个例子来总结上面的内容

struct S
{
  void foo()
    {};      // <- Legal and has always been legal
  void bar()
    {};;     // <- Legal starting from C++14, error before that
};

void baz()
{
};           // <- Legal starting from C++11, error before that
Run Code Online (Sandbox Code Playgroud)