为什么以及如何"using namespace"声明会混淆C++中的编译器?
Why and how can "using namespace" declarations confuse the compiler in C++?
到目前为止,我已经从许多不同的来源读过很多次关于"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.
}
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- 告诉c++编译器该参数没有别名
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么所有C++编译器都会崩溃或挂起此代码
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 为什么C++编译器没有检测到正确声明的类?