在 header 和 source (cpp)中创建 C + + 名称空间

在名称空间中同时包装头文件和 cpp 文件内容,或者只包装头文件内容,然后在 cpp 文件中执行 使用命名空间,这两者之间有什么区别吗?

我所说的差异是指任何类型的性能损失或稍有不同的语义,这可能会导致问题或任何我需要注意的问题。

例如:

// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}


// cpp
namespace X
{
void Foo::TheFunc()
{
return;
}
}

VS

// header
namespace X
{
class Foo
{
public:
void TheFunc();
};
}


// cpp
using namespace X;
{
void Foo::TheFunc()
{
return;
}
}

如果没有区别,什么是首选的形式,为什么?

111179 次浏览

The difference in "namespace X" to "using namespace X" is in the first one any new declarations will be under the name space while in the second one it won't.

In your example there are no new declaration - so no difference hence no preferred way.

If the second one compiles as well, there should be no differences. Namespaces are processed in compile-time and should not affect the runtime actions.

But for design issues, second is horrible. Even if it compiles (not sure), it makes no sense at all.

The Foo::TheFunc() is not in the correct namespacein the VS-case. Use 'void X::Foo::TheFunc() {}' to implement the function in the correct namespace (X).

There's no performance penalties, since the resulting could would be the same, but putting your Foo into namespace implicitly introduces ambiguity in case you have Foos in different namespaces. You can get your code fubar, indeed. I'd recommend avoiding using using for this purpose.

And you have a stray { after using namespace ;-)

In case if you do wrap only the .h content you have to write using namespace ... in cpp file otherwise you every time working on the valid namespace. Normally you wrap both .cpp and .h files otherwise you are in risk to use objects from another namespace which may generate a lot of problems.

Namespace is just a way to mangle function signature so that they will not conflict. Some prefer the first way and other prefer the second version. Both versions do not have any effect on compile time performance. Note that namespaces are just a compile time entity.

The only problem that arises with using namespace is when we have same nested namespace names (i.e) X::X::Foo. Doing that creates more confusion with or without using keyword.

I think right thing to do here is to use namespace for scoping.

namespace catagory
{
enum status
{
none,
active,
paused
}
};


void func()
{
catagory::status status;
status = category::active;
}

If you're attempting to use variables from one to the other, then I'd recommend externalizing them, then initializing them in the source file like so:

// [.hh]
namespace example
{
extern int a, b, c;
}
// [.cc]
// Include your header, then init the vars:
namespace example
{
int a, b, c;
}
// Then in the function below, you can init them as what you want:
void reference
{
example::a = 0;
}

Or you can do the following:

// asdf.h
namespace X
{
class Foo
{
public:
void TheFunc();
};
}

Then

// asdf.cpp
#include "asdf.h"


void X::Foo::TheFunc()
{
return;
}