【问题标题】:Difference between }; and } in C++}; 之间的区别和 } 在 C++ 中
【发布时间】:2014-10-08 13:55:35
【问题描述】:

C++ 的新手。

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

例如:

CircBuffer::CircBuffer()
{
    cout<<"constructor called\n";
    cout<<"Buffer has " << BufferSize << "elements\n";

    for (int i = 0; i<= BufferSize -1; i++)
    {
        Buffer[i] = 0;
    }

    ReadIn = WriteIn = 0;
    setDelay(0);

}; // <=== HERE

我找不到任何信息说明为什么要在线完成。

谢谢,刘易斯

【问题讨论】:

  • 这是一个空语句。只有类型定义需要分号:class A { ... }; 函数不需要
  • 这是一个空语句。就像在说“不要执行此行中的任何语句”
  • 可能是错字
  • @BeyelerStudios:这不是“空话”。 C++ 不允许在命名空间范围内编写语句。这是一个空声明,这是完全不同的东西。
  • @AndreyT 你是对的

标签: c++ methods


【解决方案1】:

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

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
};

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

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

【讨论】:

  • 另请注意,class C 大括号后的分号不是可选的。
【解决方案2】:

可能是为了保持一致性,也可能是为了让人想起旧代码,例如,如果原始代码只是一个声明:

CircBuffer::CircBuffer();

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

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2010-10-23
    相关资源
    最近更新 更多