使用using namespace
可以使整个命名空间的内容直接可见,无需使用命名空间限定符。如果在广泛使用的头文件中出现using namespace
可能会导致问题 - 我们可能会意外地使两个具有相同类名称的命名空间可见,编译器将拒绝编译除非在类名称前加上命名空间限定符。
我能否撤销using namespace
,使编译器忘记之前看到过它吗?
使用using namespace
可以使整个命名空间的内容直接可见,无需使用命名空间限定符。如果在广泛使用的头文件中出现using namespace
可能会导致问题 - 我们可能会意外地使两个具有相同类名称的命名空间可见,编译器将拒绝编译除非在类名称前加上命名空间限定符。
我能否撤销using namespace
,使编译器忘记之前看到过它吗?
不可以。但你可以告诉你的同事,在头文件中,不应该使用using
指令或声明。
就像其他人说的那样,你是不能这样做的,而且这个问题在第一次出现时就不应该存在。
下一步最好的解决方法是引入所需的符号,使其被名称查找优先使用:
namespace A { class C {}; }
namespace B { class C {}; }
using namespace A;
using namespace B;
namespace D {
using A::C; // fixes ambiguity
C c;
}
在某些情况下,您还可以将有问题的包含文件放入命名空间中:
namespace offender {
# include "offender.h"
}
#define
保护的头文件,那么这些符号就会被卡在offender中。你可以尝试将其整个接口打包放在新的命名空间中,但仍需确保其中不包含系统头文件。而且,即使这一次能够正常运行,下一个版本也可能会出现问题。 - Potatoswatterusing
的作用域:#include <vector>
namespace Ximpl {
using namespace std;
vector<int> x;
}
vector<int> z; // error. should be std::vector<int>
但不幸的是,using namespace Ximpl
也会引入 std
命名空间中的所有名称。
正如所述,您不应在头文件中使用using namespace sth
。当您需要从命名空间中获取功能时,可以像这样利用作用域:
void func() {
// some code agnostic to your namespace.
{
using namespace sth;
// some code aware of sth.
}
// some other code agnostic to your namespace.
}
我尝试在头文件中使用的最接近的是以下内容:
//example.h
#ifndef EXAMPLE_H_
#define EXAMPLE_H_
/**
* hating c++ for not having "undo" of using namespace xx
*/
#define string std::string
#define map std::map
class Example {
public:
Example (const char *filename);
Example (string filename);
~Example ();
private:
map<string,complicated_stuff*> my_complicated_map;
};
#undef string
#undef map
#endif //EXAMPLE_H_
毕竟,定义可以被取消。 有两个问题: 1. 它很丑陋 2. 分别使用 #define 和 #undef 为每个名称从相应的命名空间中使用
using namespace std
,而是有选择地使用 using std::vector; using std::string;
,这样你就会少遇到很多麻烦。 - Mark Ransom
#define N namespace::
,并在底部使用#undef N
。当然,这意味着你必须小心,不要在文件中任何不想要namespace::
的地方使用N
。使用typedef
也可能会有用。 - Yay295