C++在源文件中使用命名空间

Joo*_*kia 5 c++ namespaces

假设我正在创建一个项目,并且我将项目中的大多数项目都放在名为Project的名称空间中.我在名为MainProject的名称空间Project中定义了一个类.

在源文件中,要实现该类,我是否"使用命名空间项目;" 或者我将它包装在'名称空间项目{...}'巢中?

Ste*_*e M 7

给出标题"nh":

namespace n{
  extern void f();
}
Run Code Online (Sandbox Code Playgroud)

以下内容f()在命名空间中定义n(从此处开始,我将其称为n::f:

#include "n.h"
using namespace n;

void f(){ }
Run Code Online (Sandbox Code Playgroud)

如果您尝试在n::f任何地方引用,您将收到链接时错误.以上定义了全局命名空间中的f.这确实定义了n::f:

#include "n.h"
void n::f(){ }
Run Code Online (Sandbox Code Playgroud)

这也是:

#include "n.h"
namespace n{
  void f(){ }
}
Run Code Online (Sandbox Code Playgroud)

但有一个缺点,如果你错误输入名称或签名,你将添加一个新的功能到命名空间并保留void n::f()undefined,导致半恼人的链接时错误.

当涉及到课程时,事情会有所不同:

namespace n{
  class c{
    void f();
  };
  extern c operator + (const c&, const c&); // I'll use Matthieu M.'s example
}
Run Code Online (Sandbox Code Playgroud)

这没关系,因为没有全局c:

#include "n.h"
using namespace n;
void c::f(){ }
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试添加两个c,则以下将导致链接时错误,原因与第一次尝试定义时相同n::f():

#include "n.h"
using namespace n;
c operator + (const c &a, const c &b){ /* blah blah */ } // define global +
Run Code Online (Sandbox Code Playgroud)

此方案还将导致链接时错误(或者甚至可能是编译错误,具体取决于::c::f定义的位置):

class c{ // a global c, defined in some header somewhere
  void f();
};

#include "n.h"
using namespace n;
void c::f(){ } // define the global c::f (a possible redefinition) and n::c::f remains undefined!
Run Code Online (Sandbox Code Playgroud)