如何“取消使用”命名空间?

时间:2008-10-03 16:59:59

标签: c++ namespaces c++builder

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

using namespace xyzzy

...其中的语句,当我最不想要或期望它时会对我的代码产生影响。

有没有办法可以某种方式取消/覆盖之前的“使用”语句来避免这种情况。

也许......

unusing namespace xyzzy;

7 个答案:

答案 0 :(得分:55)

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

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

...然后,该标题内任何using指令的效果都会被中和。

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

答案 1 :(得分:45)

不,你不能不使用命名空间。你唯一能做的就是把using namespace - 语句放在一个块来限制它的范围。

示例:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

也许您可以更改自动生成的标题使用的模板。

答案 2 :(得分:15)

您可能会在冲突时使用显式命名空间:

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

答案 3 :(得分:10)

供将来参考:由于XE版本有一个新值,您可以#define以避免包含在内的可怕using namespace System; int:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

答案 4 :(得分:7)

如果使用sed,perl或其他一些命令行工具作为构建过程的一部分,在生成标头生成后但在使用它们之前修改生成的标头怎么样?

答案 5 :(得分:1)

使用Visual Studio 2005进行快速实验表明,您可以将这些标头包含在您自己的命名空间中,然后use将您需要的内容放在此命名空间中(但不要use整个命名空间,因为它将介绍您要隐藏的命名空间。

答案 6 :(得分:-1)

#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}