告诉编译器我不再使用 C++ 中的命名空间

Posted

技术标签:

【中文标题】告诉编译器我不再使用 C++ 中的命名空间【英文标题】:Telling the compiler that I am no longer using a namespace in C++ 【发布时间】:2013-04-18 21:16:05 【问题描述】:

语法:

 using namespace x;

告诉编译器从命名空间 x 中查找符号。一旦你在两个命名空间中有相同的符号并且你想相互使用它们,情况就会变得很糟糕。有没有办法告诉编译器不要使用命名空间?我的意思是这样的(命名空间 x 和 y 都具有函数 a)

using namespace x;
int k = a(); //x::a is called
drop namespace x; //imaginary syntax that I am looking for
using namespace y;
int j = a(); //y::a is called

“您必须使用范围解析符号'::'”不是我正在寻找的答案。

【问题讨论】:

你为什么不想使用范围解析?? “医生,医生,我这样做的时候好痛!” 首先不要使用using namespace 确实如此,但我想知道你是不是没抓住重点。 Nitpick:你不能不使用范围解析。没有resolution,所有的东西都是unresolved定义的,任何程序都不会被链接。你的意思(我认为)是我不想对标识符的使用做明确的命名空间限定。 【参考方案1】:

既然你不想使用范围解析,那就创建一些额外的范围:


    using namespace x;
    int k = a(); //x::a is called


    using namespace y;
    int j = a(); //y::a is called

我担心这可能会变得比范围解析更糟糕:/

编辑:

另外一件可能有用的事情(我不知道你是否知道)是命名空间别名。假设您有一个名称长得令人作呕的名称空间或多个嵌套的名称空间。您可以缩短名称,例如:

namespace x = very::weird::namespc::name;
namespace y = yabadabadoopdiedoo;

【讨论】:

很高兴它有帮助,如果你的同事因此而批评你,请不要怪我;) OP 非常讨厌 Krillin。无论如何,只是一个建议。如果您使用 C++ 编程,请使用 C++ 编程。我不想成为维护您的代码的人。 @GreenCode 不,省略它们会使事情变得复杂。 @GreenCode 这不是您的个人帮助台,鼓励以这种特殊方式解决这个~~问题~~的答案对以后会偶然发现这个问题的人有害。您的英文单词完全不相关,因为它只是 XY 问题的标志(即您发明了一个解决方案并想知道如何实现它,但它一开始就不是正确的解决方案)。 @CatPlusPlus:我无意伤害任何人的知识,如果我对任何人表现出不尊重,我感到非常抱歉。我只想问这在 C++ 中是否可行。我认为这个问题有一个正确的答案,它是我选择的那个。再次,我很抱歉我的不礼貌,但请理解,在我的问题正文中,我提到使用范围解析不是我想要的。【参考方案2】:

您不能“删除”命名空间,但是,当使用命名空间组合时,您可以解决特定的歧义,如下所示:

namespace composite 
    using namespace x;
    using namespace y;
    using y::a; // use y::a in case of ambiguity

    void foo() 
        a(); // calls y::a
    

【讨论】:

@jrok It works for me. 现在这很奇怪,也许我错过了什么。您是否检查了我更新评论中的链接? (顺便说一句,我没有投反对票) 你需要缩小最后一个 using 语句的范围。 Example. 或者,更好的是,reduce the scope of all using directive.。 IIRC 它仅在全局命名空间中不起作用。 (此功能称为“命名空间组合顺便说一句。所以它是有道理的..) using namespace a 之后添加using y::a 不会增加任何内容,AFAIK。它只是将名称 a 插入到封闭的命名空间中,这已经发生了。【参考方案3】:

2 using-directive 指定指定命名空间中的名称可以在 using-directive 出现在 using-directive 之后。 在非限定名称查找 (3.4.1) 期间,名称出现 就好像它们是在最近的封闭命名空间中声明的,其中包含使用指令和 命名空间。 [注:在此上下文中,“包含”是指“直接或间接包含”。 -结尾 注意]

因此您必须使用不同的范围。使用后无法取消使用。

【讨论】:

以上是关于告诉编译器我不再使用 C++ 中的命名空间的主要内容,如果未能解决你的问题,请参考以下文章

喵呜:C++基础系列来啦来啦:namespace命名空间详解

初步认识c++之命名空间详解(千字长文带你刨析你命名空间的细节)

使用在同一命名空间中定义的构造函数实例化命名空间中的对象。 C++

整个类范围内的 C++ 命名空间别名

typescript - 8.命名空间

“使用命名空间”如何在C ++中工作