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

25

用类似这样的方式进行替换,是否合法:

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

就像这样:

namespace foo::bar {
   baz();
}

?


1
你想通过这个做什么? - Chubsdad
7
这适用于C++17。 - Jesse Pepper
2
你会在7年后看到它的 :) - Akib Azmain Turja
7个回答

41

你可以将不同的命名空间合并成一个名称并使用新名称(即Foobar)。

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

namespace Foobar = Foo::Bar;

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

5
另一个不必要、令人困惑的功能。 - mert inan

23

在 C++17 之前:

不是的。除了一堆缩进的嵌套命名空间外,将它们放在同一行上是完全有效的:

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

C++17更新:

现在你可以更加清晰地嵌套命名空间于C++17中:

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

8

5

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

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

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

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

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


4
不,这是语法错误。

1
你试过了吗?使用Visual C++后我得到了以下错误:

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


5
注意:某些东西在特定编译器上能够工作或不能工作,并不意味着它符合标准或不符合标准。 - Billy ONeal
1
@Billy:某些东西能工作并不意味着什么,某些东西不能工作才重要。如果你的编译器不支持某个特性,那么无论标准上怎么说,你都无法使用它。 - Dennis Zickefoose
2
@Dennis:虽然这是正确的,但是OP并没有问他或她的编译器是否支持它,而是问它是否有效。 - Billy ONeal

0
根据 $2.10 中的语法规定,标识符不能包含符号 ":"。因此,名称 foo::bar 是不合法的。

1
这并不意味着太多,除非还表明此处需要一个标识符。foo::bar有时显然是有效的。 - Dennis Zickefoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接