我可以取消 C++ 中“使用命名空间”的效果吗?

问题描述 投票:0回答:7

使用

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

我可以撤消

using namespace
以便编译器忘记它之前看到过它吗?

c++ namespaces using
7个回答
40
投票

不,但是你可以告诉你的同事你永远不应该在标题中有

using
指令或声明。


16
投票

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

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

7
投票

不,C++ 标准没有说明任何关于“撤消”的内容。你被允许做的最好的事情就是限制

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
投票

据我所知……但通常我只在 .cpp 文件中使用“使用命名空间”。


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 的。 有两个问题: 1.很丑 2. 使用来自相应命名空间的每个名称的单独#define 和#undef


0
投票

如前所述,您不应在头文件中使用

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

0
投票
  1. 线程已老化,尽管@rlbond 可能已将“命名空间声明”与“使用指令”分开,所以显然我不得不在这里思考。
  2. @Georg Fritzsche 通过命名他的“罪犯”来鼓励有毒环境。至少,您发现任何工作产品都令人不满意。
  3. 就个人而言,我不喜欢在任何地方洒上“std::”(它变成了一群蚊子),尽管我同意@rlbond 避免在任何标头中使用任何子句。将执行代码与头文件分开(如:建立链接库)始终是良好的编程习惯。
© www.soinside.com 2019 - 2024. All rights reserved.