我可以在C ++中撤消“using namespace”的效果吗?

时间:2010-01-28 07:23:38

标签: c++ namespaces using

使用using namespace我可以直接看到该命名空间的全部内容,而无需使用命名空间限定符。如果在广泛使用的标头中出现using namespace,这可能会导致问题 - 我们可能无意中使两个具有相同类名称的名称空间可见,并且编译器将拒绝编译,除非类名前缀为名称空间限定符。

我是否可以撤消using namespace以便编译器忘记它以前看过它?

5 个答案:

答案 0 :(得分:35)

不,但你可以告诉你的同事你不应该在标题中有using指令或声明。

答案 1 :(得分:15)

正如其他人所说,你不能,问题不应该放在首位 您可以做的下一个最好的事情是引入您需要的符号,以便通过名称查找首选符号:

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"
}

答案 2 :(得分:6)

不,C ++ Standard没有说“撤消”。您可以做的最好的事情是限制using的范围:

#include <vector>

namespace Ximpl {

using namespace std;    
vector<int> x;

}

vector<int> z; // error. should be std::vector<int>

但不幸的是using namespace Ximpl也会带来std命名空间中的所有名称。

答案 3 :(得分:3)

据我所知......但作为一项规则,我只在.cpp文件中使用“using namespace”。

答案 4 :(得分:0)

我将尝试在头文件中使用的最接近的内容如下:

//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_

毕竟,定义是#undef -able。 有两个问题: 这很难看 2.使用相应名称空间中的每个名称分别使用#define和#undef