15

在C++ 头文件中使用被认为是不好的做法。在标头中使用命名空间别名using namespace是否同样是一个坏主意,并且每个实现文件都应该声明它希望使用的别名?

由于标题是您倾向于使用完全指定名称的地方(因为我们不在标题中使用命名空间),所以别名会很有用,但它们仍然会在#included.

这里的最佳做法是什么?命名空间别名的范围是什么

4

2 回答 2

10

如果您将命名空间别名放入您的标头中,该别名将成为您的(公共)API 的一部分。

有时这种技术用于执行 ABI 兼容版本控制(或至少使损坏可见),如下所示:

namespace lib_v1 { ... }
namespace lib_v2 { ... }
namespace lib = lib_v2;

或更常见的:

namespace lib {
   namespace v1 {}
   namespace v2 {}
   using namespace v2;
}

另一方面,如果您这样做只是为了节省一些打字,那可能不是一个好主意。(仍然比使用using指令好得多)

于 2013-03-22T15:46:27.970 回答
2

我用这种方式使用未命名的命名空间:

#include <whatyouneed>
...
namespace {

typedef ...
using ..
namespace x = ...

// anything you need in header but shouldn't be linked with original name

}

// normal interface
class a: public x::...
于 2013-03-22T14:53:23.830 回答