如何"取消使用"命名空间?

时间:2020-03-06 15:05:12  来源:igfitidea点击:

我的开发系统(Codegear C ++ Builder)变幻莫测的其中之一是,一些自动生成的标头坚持要求...

using namespace xyzzy

...它们中的语句,当我最不想要或者期望它时,它将影响我的代码。

有没有一种方法可以某种方式取消/覆盖以前的" using"语句来避免这种情况。

可能是...

unusing namespace xyzzy;

解决方案

不,我们不能取消使用命名空间。我们唯一可以做的就是将" using namespace"语句放置一个块以限制其范围。

例子:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

也许我们可以更改用于自动生成的标头的模板。

对Visual Studio 2005的快速实验表明,我们可以将这些标头包含在自己的命名空间中,然后"使用"该名称空间中的所需内容(但不要"使用"整个名称空间,因为它将引入我们想要的名称空间)隐藏。

我们可能会在冲突时使用显式命名空间而陷入困境:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace

没有。但是有一个潜在的解决方案:如果将include指令包含在它自己的名称空间中,就像这样...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

...然后抵消该标头中所有using指令的影响。

在某些情况下,这可能是有问题的。这就是为什么每个C ++样式指南都强烈建议不要在头文件中放置" using namespace"指令。

将sed,perl或者其他一些命令行工具用作生成过程的一部分,以在生成生成的标头之后但在使用它们之前对其进行修改,该如何做?