2

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

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

我也很惊讶我什至没有收到警告之类的。但这是否意味着您可能会意外使用一个已经使用过的名称而没有开始意识到它从而扩展它?

4

2 回答 2

3

您当然可以这样做,C++11 标准 N3485 第 7.3.3.11 节中提供了一个示例

引用如下。

由 using-declaration 声明的实体应根据 using-declaration 处的定义在使用它的上下文中为人所知。在使用该名称时,不考虑在 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) 
}

—结束示例]

于 2013-05-23T14:05:00.750 回答
2

是的,您可以将命名空间的内容拆分为多个部分。

如果你编译 using和gccuse会给你非标准代码的警告。-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. 
   }
}
于 2013-05-23T14:02:13.500 回答