c++ - 不使用左右停止工作命名空间std的简单比较
问题描述
.cpp 文件中有一个函数,如下所示:
void function() {
//...
if (left != right)
do_something();
}
在最终包含在该 .cpp 文件中的不相关头文件中,有以下行:
using namespace std;
using namespace std
我正在做一些清理工作,到处都摆脱了这个,并添加了缺失的std::
资格。然而,这if (left != right)
条线不再编译了……什么给出了?
解决方案
好吧:如果他们告诉你这using namespace std
很糟糕,他们是认真的!
事实证明,这left != right
是从旧版本代码中留下的比较,它读取
void function() {
int left, right;
//...
if (left != right)
do_something();
}
后来,代码被重构,left
和right
本地人被删除。
与using namespace std
,比较被解释为if (std::left != std::right)
,并且总是正确的!因为std::left
andstd::right
是两个函数,所以它们总是比较不同,它们可以比较,因为 C++ 继承了 C 的,哎呀,疯狂,并且在必要时将函数视为函数指针。
所以,是的,如果你是using namespace std
,你应该停下来。马上。它会很高兴地编译无意义的代码,而你却不知道......
PVS-Studio 可以使用 V1058 诊断找到这样的错误:https ://godbolt.org/z/YZTwhp (谢谢 Andrey Karpov !!)。
ping cppcheck 开发人员:您可能希望标记这个。这真是太棒了。
推荐阅读
- find - 这里使用什么语言?
- c# - 回发asp.net后如何在gridview中保持状态
- javascript - 鼠标悬停在Angular 6中打开menga菜单
- java - 以通用方式获取 POJO 的属性
- python - Scrapy 和 Splash 正确设置但仍然出现连接错误
- javascript - 通过数组在Angular 6中引导多个模块
- vba - 复制范围直到最后一行值等于 0
- html - Bootstrap 4.1 列内的额外填充
- javascript - Nativescript - 应用程序关闭时运行代码
- laravel - 如何从 laravel 中现有的 Web 中间件登录中进行 api 身份验证