假设我正在创建一个项目,并且我将项目中的大多数项目都放在名为Project的名称空间中.我在名为MainProject的名称空间Project中定义了一个类.
在源文件中,要实现该类,我是否"使用命名空间项目;" 或者我将它包装在'名称空间项目{...}'巢中?
给出标题"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)
| 归档时间: |
|
| 查看次数: |
2969 次 |
| 最近记录: |