我的开发系统(Codegear C++Builder)的变幻莫测之一是一些自动生成的标题坚持...
using namespace xyzzy
...其中的语句,当我最不想要或期望它时会影响我的代码。
有没有办法我可以以某种方式取消/覆盖以前的“使用”语句来避免这种情况。
也许...
unusing namespace xyzzy;
我的开发系统(Codegear C++Builder)的变幻莫测之一是一些自动生成的标题坚持...
using namespace xyzzy
...其中的语句,当我最不想要或期望它时会影响我的代码。
有没有办法我可以以某种方式取消/覆盖以前的“使用”语句来避免这种情况。
也许...
unusing namespace xyzzy;
没有。但是有一个潜在的解决方案:如果你将你的 include 指令包含在它自己的命名空间中,就像这样......
namespace codegear {
#include "codegear_header.h"
} // namespace codegear
...然后该标头中的任何 using 指令的效果都会被中和。
在某些情况下,这可能是有问题的。这就是为什么每个 C++ 风格指南都强烈建议不要在头文件中放置“使用命名空间”指令的原因。
不,您不能取消使用命名空间。您唯一能做的就是将using namespace
-statement 放在一个块中以限制其范围。
例子:
{
using namespace xyzzy;
} // stop using namespace xyzzy here
也许您可以更改用于自动生成的标题的模板。
您可能会在冲突中使用显式命名空间:
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
供将来参考:由于 XE 版本有一个新值,您可以#define 以避免可怕using namespace System;
的 int 包含:DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE
使用 sed、perl 或其他一些命令行工具作为构建过程的一部分,在生成头文件之后但在使用之前修改它们如何?
使用 Visual Studio 2005 的快速实验表明,您可以将这些标头包含在您自己命名的命名空间中,然后use
从该命名空间中获得您需要的内容(但不要use
包含整个命名空间,因为它会引入您想要隐藏的命名空间。
#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);
}