我想知道可以拆分命名空间,或者命名空间的定义必须在单个块中。说明我的意思:
namespace test
{
//declare a bunch of stuff here
int a;
}
我们在这里做其他事情,比如声明一个类或其他什么
class T
{
};
这里继续上面的命名空间,扩展它
namespace test
{
//declare a bunch of additional stuff here
int b;
T val;
}
在此示例中,名称空间test
已被使用了两次,这是否意味着test
被第二次定义延长了?当我在gcc中使用它时,它按预期工作。我可以使用test::...
访问所有变量,就好像它是在单个命名空间中定义的一样。当然这并不能使它成为标准,所以我想知道这是否符合标准。
我也很惊讶我甚至没有得到警告等。但是,这不意味着您可以意外地使用已经使用的名称,而不会开始意识到它,从而扩展它吗?
答案 0 :(得分:3)
您当然可以这样做,C ++ 11标准N3485第7.3.3.11节中提供了一个示例
引用如下。
使用声明声明的实体应该在 根据其定义使用它的上下文 using声明。定义后添加到命名空间的定义 在使用名称时不考虑使用声明。
[例如:
namespace A { void f(int); } using A::f; // f is a synonym for A::f; // that is, for A::f(int). namespace A { void f(char); } void foo() { f(’a’); // calls f(int), } // even though f(char) exists. void bar() { sing A::f; // f is a synonym for A::f; // that is, for A::f(int) and A::f(char). f(’a’); // calls f(char) }
-end example]
答案 1 :(得分:2)
是的,您可以将命名空间的内容分成几个部分。
如果使用gcc
进行编译并使用-ansi
,则-pedantic
将为您提供非标准代码的警告。
当然,当您在头文件中声明一组内容然后在源文件中实现它们时,这种情况的典型用例。
// header.h
namespace somename
{
class A
{
// stuff goes here
void func();
// more stuff.
}
}
// source.cpp
#include "header.h"
namespace somename
{
void A::func()
{
// whatever A::func() is supposed to do goes here.
}
}