C ++拆分命名空间声明

时间:2013-05-23 14:00:31

标签: c++ namespaces

我想知道可以拆分命名空间,或者命名空间的定义必须在单个块中。说明我的意思:

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::...访问所有变量,就好像它是在单个命名空间中定义的一样。当然这并不能使它成为标准,所以我想知道这是否符合标准。

我也很惊讶我甚至没有得到警告等。但是,这不意味着您可以意外地使用已经使用的名称,而不会开始意识到它,从而扩展它吗?

2 个答案:

答案 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. 
   }
}