【问题标题】:Semicolon in namespace. Necessary?命名空间中的分号。必要的?
【发布时间】:2026-02-12 05:25:02
【问题描述】:

使用命名空间时,我需要用分号结束它吗?例如,当我将一个类的前向声明放入命名空间时,很多人不包含分号,但它似乎是可选的。

分号是添加功能还是通过添加或删除来更改当前功能?

谢谢。

【问题讨论】:

  • 您能否编辑以包含您的意思的示例?

标签: c++ namespaces


【解决方案1】:

如果分号是可选的,它不会改变功能,否则你会得到一个语法错误。

namespace A {
    class B; // forward declaration, semicolon is mandatory.

    class B {
    }; // class definition, semicolon is mandatory

    class C {
    } f(); // because otherwise it is a return type of a function.
} // no need for semicolon

namespace D = A; // semicolon is mandatory.

如果这些不是你所说的情况,请发表评论。

【讨论】:

  • 当你说“不需要分号”时,任何分号在 C++03 中都是非法的。
  • @Charles:你确定吗?在 C++0x 和 C++98 中,simple-declaration 可以退化为 ;(所有其他标记为 opt)。
  • 是的,检查 7 [dcl.dcl] 第 3 段。在 simple-declaration 中,可选的 init-declarator-list 只能在声明类或枚举时省略, ... .基本上,init-declarator-list 只有在 decl-specifier-seq 不是时才可以省略。
  • 这在 C++0x 中当然是合法的,因为有一种新的 declaration 类型,即 empty-declaration,它由只是一个; 并且明确没有效果。就个人而言,我没有看到使用 empty-declaration 的意义。
  • 它有点用处,因为它使int a;; 合法。考虑一个宏#define DECLARE_MEMBER(x) int x;,无意中用作DECLARE_MEMBER(a);
【解决方案2】:

没有。命名空间不需要以分号结尾,尽管Bjarne wanted to do it 我想减少与其他 C++ 结构的语法相关差异。但是我不确定为什么它没有被接受。

“愚蠢的打字错误将不可避免地 源于句法相似性 命名空间构造到其他 C++ 结构体。我建议我们允许一个 全局后的可选分号 声明以减轻挫败感。 这将是一种“空 声明''以匹配空 声明。”

类的所有前向声明都需要以分号结尾。你能举例说明它在 C++ 中哪里是可选的吗?

【讨论】:

  • 我认为 bruce eckel 建议以分号结尾以强制执行隔离块的想法
【解决方案3】:

不,您不需要用分号“结束”。这不是常见的做法,也没有任何效果。

namespace foo
{
    ...
} // no semi-colon necessary here.

【讨论】: