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


86

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

using namespace xyzzy

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

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

也许...

unusing namespace xyzzy;

3
您可能应该使用他们的QC系统打开错误报告:qc.codegear.com
Kris Kumler

2
顺便说一句,这些是哪些自动生成的标头?
Kris Kumler

2
有一天,C ++将具有模块,并且将代码包含在其他代码中将具有更好的封装构造。在此之前,还没有一个简单的方法可以解决此问题。考虑将您自己的代码放入名称空间并以这种方式引用它。
Trevor Hickey

Answers:


59

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

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

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

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


1
总的来说,这是一个糟糕的主意。C ++标头不打算包含在此处使用的替代名称空间中。
亚伦

24
在头文件中也包含using指令是一个糟糕的主意。这只是减轻了这个问题。
极客头

4
将标头放在您自己的名称空间中不是解决方案,因为它会更改该库中声明的含义。(-1)
理查德·科登,

4
这完全取决于标题中声明的内容。
极客头

1
这就是为什么它是未定义的行为。
Kris Kumler

56

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

例:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

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


但是,您可以将include包裹在这样的块中吗?

是的,这不会与自动生成的代码一起使用。再见,我可以更改自动生成代码的模板吗?
jk。

是的,这并没有真正解决他使用名称空间的标头问题。
基普(Kip)

不幸的是,这不是事实。试试这个:
Adam

名称空间xyzzy {const int i {使用名称空间xyzzy; } //在此处停止使用命名空间xyzzy
Adam

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

10

供以后参考:自XE版本以来,您可以#define一个新值,以避免using namespace System;包含中的可怕内容:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE


但这似乎无法正常工作。至少在我尝试过的所有情况下(使用BCB6)。然后,我习惯于在冲突时添加显式名称空间,并且-更糟的是-包括避免类型名称冲突的标头...
Wolf

6

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


1

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


1
如果头文件是库的声明,则可能会导致名称处理问题。编译将成功,但是链接器将无法找到定义,因为它们已经在不同的命名空间中进行了编译。
日食

-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);
}

1
请解释您的答案!
Mazz17年

您可以使用范围解析运算符来使用另一个名称空间变量
Narendra kumawat

3
没有解决的问题
MM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.