88

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

using namespace xyzzy

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

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

也许...

unusing namespace xyzzy;
4

7 回答 7

62

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

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

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

在某些情况下,这可能是有问题的。这就是为什么每个 C++ 风格指南都强烈建议不要在头文件中放置“使用命名空间”指令的原因。

于 2008-10-03T17:39:08.487 回答
58

不,您不能取消使用命名空间。您唯一能做的就是将using namespace-statement 放在一个块中以限制其范围。

例子:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

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

于 2008-10-03T17:34:06.373 回答
17

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

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
于 2008-10-03T17:38:35.460 回答
10

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

于 2011-01-10T23:17:22.717 回答
3

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

于 2008-10-03T17:55:23.930 回答
1

使用 Visual Studio 2005 的快速实验表明,您可以将这些标头包含在您自己命名的命名空间中,然后use从该命名空间中获得您需要的内容(但不要use包含整个命名空间,因为它会引入您想要隐藏的命名空间。

于 2008-10-03T17:37:54.620 回答
-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);
}
于 2017-04-26T09:18:48.590 回答