首页 > 解决方案 > 不使用左右停止工作命名空间std的简单比较

问题描述

.cpp 文件中有一个函数,如下所示:

void function() {
  //...
  if (left != right)
    do_something();
}

在最终包含在该 .cpp 文件中的不相关头文件中,有以下行:

using namespace std;

using namespace std我正在做一些清理工作,到处都摆脱了这个,并添加了缺失的std::资格。然而,这if (left != right)条线不再编译了……什么给出了?

标签: c++

解决方案


好吧:如果他们告诉你这using namespace std很糟糕,他们是认真的!

事实证明,这left != right是从旧版本代码中留下的比较,它读取

void function() {
  int left, right;
  //...
  if (left != right)
    do_something();
}

后来,代码被重构,leftright本地人被删除。

using namespace std,比较被解释为if (std::left != std::right),并且总是正确的!因为std::leftandstd::right是两个函数,所以它们总是比较不同,它们可以比较,因为 C++ 继承了 C 的,哎呀,疯狂,并且在必要时将函数视为函数指针。

所以,是的,如果你是using namespace std,你应该停下来。马上。它会很高兴地编译无意义的代码,而你却不知道......

PVS-Studio 可以使用 V1058 诊断找到这样的错误:https ://godbolt.org/z/YZTwhp (谢谢 Andrey Karpov !!)。

ping cppcheck 开发人员:您可能希望标记这个。这真是太棒了。


推荐阅读