为什么以及如何“使用命名空间”声明会混淆C ++中的编译器?

时间:2014-01-15 21:54:36

标签: c++ namespaces

到目前为止,我已经从很多不同的来源读过关于“cout / cin很模糊”的内容,并且我一直听到:

“使用'std ::'作为前缀,因为它可能会混淆你的编译器”

现在,我知道不使用范围运算符可能是一种不好的做法,并且通常会收到此类错误的人在编程中处于初级阶段。然而,消息来源说,我应该理解这是如何与时间一起工作的,不幸的是,我还没有。我偶尔也会收到错误(因为我尽管有所有警告,仍然使用“使用命名空间”声明),但我仍然不明白为什么它在99%或者情况下工作,而不是在另一种情况下工作。

我在Visual Studio Express(2012)中对我的代码进行了操作,当然,包含了所有必需的源代码(在本例中是iostream库),因此没有任何类型的永久性错误;它实际上往往是随机弹出(例如,我已经改变了一段代码,使错误出现,然后甚至在更改后,错误仍然存​​在)......真的,我没看到任何逻辑解释为什么错误出现在随机背景中 - 因此我要问:

导致此错误的原因是什么(它是什么意思,为什么以及 如何混淆处理器)?此外,是否值得跳过这些声明呢?不能以某种方式修复它吗?

事先谢谢!

1 个答案:

答案 0 :(得分:1)

这就是你如何通过虔诚地using namespace ...来混淆它。现在假设您正在使用的某个库定义了一个名为foo的函数。让我们假设它是提升或其他什么。甚至可能是你自己的名字命名为“op”。你有一个名为foo的函数。我的命名空间可能与您的名称空间具有相同的功能。如果导入两个名称空间,编译器将如何知道调用哪个?例如,见下文。

#include <cstdio>

namespace me
{
    void foo()
    {
        printf("%s", "Calling me::foo\n");
    }
}

namespace op
{
    void foo()
    {
        printf("%s", "Calling op::foo\n");
    }
}


using namespace me;
using namespace op;

int main()
{
    foo(); //abiguous call.. Which foo is it going to use? op::foo? Or me::foo?

    //now remove the using namespace me and using namespace op.. then try the below:

    me::foo();
    op::foo();

    //The compiler now knows which foo you're trying to call and calls the correct one.
}
相关问题