C ++中的多个名称空间声明

时间:2010-08-28 02:35:15

标签: c++ namespaces scope

更换这样的东西是否合法:

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

有这样的事情:

namespace foo::bar {
   baz();
}

7 个答案:

答案 0 :(得分:36)

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

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

namespace Foobar = Foo::Bar;

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

答案 1 :(得分:13)

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

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

<强>更新

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

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

答案 2 :(得分:5)

合格的名称,如C ++中的something::someting_else,只能用于引用之前已声明过的实体。您不能使用此类名称来介绍以前未知的内容。即使先前已经声明了嵌套命名空间,扩展该命名空间也被视为“引入新内容”,因此不允许使用限定名称。

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

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

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

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

答案 3 :(得分:5)

对于任何想知道的人,从C ++ 17开始支持namespace foo::bar格式。参考文献:

答案 4 :(得分:4)

没有;这是一个语法错误。

答案 5 :(得分:1)

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

  

1&gt; C:\ ... \ foo.cpp(31):错误C2061:语法错误:标识符'bar'
  1&gt; C:\ ... \ fooo.cpp(31):错误C2143:语法错误:缺少';'在'{'

之前

答案 6 :(得分:0)

根据$ 2.10中的语法,标识符不能包含令牌":"。因此名称foo::bar格式不正确。