为什么以及如何"using namespace"声明会混淆C++中的编译器?

Why and how can "using namespace" declarations confuse the compiler in C++?

本文关键字:C++ 编译器 声明 namespace using 为什么      更新时间:2023-10-16

到目前为止,我已经从许多不同的来源读过很多次关于"cout/cin不明确"的文章,我一直听到:

"使用‘std::’作为前缀,因为它可能会混淆编译器">

现在,我确实知道,根据一些人的说法,不使用scope运算符可能是一种糟糕的做法,而通常收到这种错误的人正处于编程的初级阶段。然而,消息人士说,我应该理解这是如何随着时间的推移而工作的,但不幸的是,我还没有。我仍然偶尔会收到错误(因为尽管有所有警告,我仍然使用"使用命名空间"声明),我仍然不明白为什么它在99%或其他情况下有效,而在其他情况下无效。

我正在Visual Studio express(2012)中调试我的代码,当然,所有所需的源代码都包括在内(在本例中是iostream库),因此不会出现任何永久性错误;它实际上倾向于非常随机地弹出(例如,有几次,我更改了一段代码,使错误出现,然后即使在将其更改回后,错误仍然存在)。。。真的,我看不出任何逻辑解释为什么错误会出现在随机环境中——因此我问:

究竟是什么原因导致了这个错误(它是什么意思,为什么以及它是如何混淆处理器的)?此外,是否值得因此而跳过这些声明?难道不能以某种方式解决吗?

事先谢谢!

这就是通过虔诚地执行using namespace ...来混淆它的方法。现在假设您正在使用的某个库定义了一个名为foo的函数。让我们假设它是助推或其他什么。甚至可能是您自己的名为"op"的命名空间。您有一个名为foo的函数。我的命名空间可能与您的命名空间具有相同的函数签名。如果同时导入两个名称空间,编译器将如何知道该调用哪个名称空间?请参见以下示例。

#include <cstdio>
namespace me
{
void foo()
{
printf("%s", "Calling me::foon");
}
}
namespace op
{
void foo()
{
printf("%s", "Calling op::foon");
}
}

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