}之间的差异;以及在C++中的}

Difference between }; and } in C++

本文关键字:C++ 中的 之间      更新时间:2023-10-16

C++的全新功能。

在一个项目中为一项任务而苦恼,在一些示例代码中,我发现了以}结尾的方法;而不是典型的(预期的)}

例如:

CircBuffer::CircBuffer()
{
    cout<<"constructor calledn";
    cout<<"Buffer has " << BufferSize << "elementsn";
    for (int i = 0; i<= BufferSize -1; i++)
    {
        Buffer[i] = 0;
    }
    ReadIn = WriteIn = 0;
    setDelay(0);
}; // <=== HERE

我找不到任何关于为什么要在网上这样做的信息。

谢谢,Lewis

命名空间范围中的尾随;构成空声明。上面代码中的内容被编译器视为

CircBuffer::CircBuffer()
{
  ...
}      // <- the `CircBuffer::CircBuffer` definition ends here
;      // <- an empty declaration that declares nothing

也就是说,从编译器的角度来看,方法定义并没有真正以};结束。它以}结束,而;被完全分开和独立地处理。

空声明在C++的原始版本和C++03中是非法的,但在C++11中是合法的。因此,您上面引用的代码在C++98和C++03中是无效的,但在C++11中是合法的。然而,即使是C++98编译器也经常支持空声明作为非标准扩展。

请注意,以上内容仅适用于类外函数定义(如您的示例中所示)。通过类内成员函数定义,尾随的;始终是合法的(可选的)

class C
{
  C()
  {
    ...
  }; // <- ';' not required, but legal even in C++98
};

(在这种情况下,可选的;实际上是成员定义的一部分,这意味着该定义确实以};结束,并且不会引入空声明。)

当你在实际代码中看到这样的东西时,这可能只是一个坏习惯,可能是基于类内和类外定义上下文之间的混淆。

可能是为了一致性,也可能是旧代码的回忆,例如,如果原始代码只是一个声明:

CircBuffer::CircBuffer();

如果有人想添加一个内联实现,他可能会在后面的;之前单击,并开始在那里编写正文,忘记删除;