【问题标题】:Multiple namespace declaration in C++C++ 中的多个命名空间声明
【发布时间】:2011-04-05 02:09:08
【问题描述】:

这样替换是否合法:

namespace foo {
   namespace bar {
      baz();
   }
}

类似这样的:

namespace foo::bar {
   baz();
}

?

【问题讨论】:

  • 你想通过这个达到什么目的?
  • 这适用于 c++17。
  • 你会在询问的7年后看到它:)

标签: c++ namespaces scope


【解决方案1】:

您可以将命名空间组合成一个名称并使用新名称(即 Foobar)。

namespace Foo { namespace Bar {
    void some_func() {
        printf("Hello World.");
    }
}}

namespace Foobar = Foo::Bar;

int main()
{
    Foobar::some_func();
}

【讨论】:

  • 另一个不必要的、令人困惑的功能。
【解决方案2】:

C++17 前

不,不是。代替一堆缩进的嵌套命名空间,将它们放在同一行当然是有效的:

namespace Foo { namespace Bar { namespace YetAnother {
    // do something fancy
} } } // end Foo::Bar::YetAnother namespace

C++17 更新

You can now nest namespaces more cleanly in C++17:

namespace Foo::Bar::YetAnother {
  // do something even fancier!
}

【讨论】:

    【解决方案3】:

    对于任何想知道的人,namespace foo::bar 从 C++17 开始就支持这种形式。参考资料:

    【讨论】:

      【解决方案4】:

      限定名称,如 C++ 中的something::someting_else,只能用于引用之前已经声明过的实体。你不能用这样的名字来介绍以前不知道的东西。即使嵌套命名空间之前已经声明过,扩展该命名空间也被视为“引入新事物”,因此不允许使用限定名称。

      您可以使用这些名称来定义先前在命名空间中声明的函数

      namespace foo {
        namespace bar {
          int baz();
        }
      }
      
      // Define
      int foo::bar::baz() {
        /* ... */
      }
      

      但不声明扩展现有命名空间的新命名空间。

      【讨论】:

        【解决方案5】:

        没有;这是语法错误。

        【讨论】:

          【解决方案6】:

          你试过了吗? Visual C++ 给我以下错误:

          1>C:\...\foo.cpp(31):错误 C2061:语法错误:标识符“bar”
          1>C:\...\fooo.cpp(31): 错误 C2143: 语法错误: 缺少';'在'{'之前

          【讨论】:

          • 注意:仅仅因为某些东西在特定编译器上工作或不工作并不意味着它符合标准或不符合标准。
          • @Billy:工作并不意味着什么。 不起作用的东西会起作用。如果您的编译器不支持某个功能,那么您就不能使用它,无论标准对此主题有何规定。
          • @Dennis:虽然这是真的,但 OP 并没有询问他或她的编译器是否支持它,而是询问它是否有效。
          【解决方案7】:

          根据 $2.10 中的语法,标识符不能具有标记 ":"。所以foo::bar 这个名字不正确。

          【讨论】:

          • 这并不意味着什么,也没有表明这里需要一个标识符。 foo::bar 有时显然是有效的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 2012-07-27
          • 2011-09-20
          • 1970-01-01
          相关资源
          最近更新 更多