C++ 哈希弃用警告

C++ Hash Deprecation Warning

我对 C++ 和一般编程还很陌生,目前正在阅读 Bjarne Stroustrup 的编程:使用 C++ 的原则和实践。我一直收到以下错误

Severity Code Description Project File Line Error C2338 <hash_map> is deprecated and will be REMOVED. Please use <unordered_map>. You can define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS to acknowledge that you have received this warning.

我知道头文件 std_lib_facilities.h 使用了某种已弃用的函数,但有没有办法绕过它?看起来它要我定义“_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS”,但我不确定该怎么做。任何帮助将不胜感激!!

您可以在包含生成警告的 header 之前放置定义:

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <hash_map>

您也可以在项目文件的Proprocessor Definitions中添加符号。

后者看起来更漂亮,但是鉴于您的做法违背了工具制造商的建议,我会选择第一种方法,所以您不要忘记后者可能会被烧毁。

警告不是关于 "some function" - 它是关于整个 stdext。而且它不仅仅是手摇式的,最终,已弃用:它不随 2015 一起提供。

00年代初期,C++标准的修订工作正在进行中;包括微软在内的不同编译器供应商将提案连同原型一起提交给委员会。为了可以对它们进行测试和评估,Microsoft 将其提议的扩展的实现放在 stdext.

最终委员会选择了他们要纳入该修订版的内容并发布了一份技术报告 ("TR1")。预计在 2009 年底前完成,这被称为 "C++0x",编译器供应商开始在 tr1 命名空间中实现这些功能。最终在 2011 年,该标准最终确定下来,我们得到了 "C++11" 及其所有的点点滴滴回到 std 它们所属的地方。

根据 Microsoft 的提议,容器将是 std::hash_map,但 C++ 委员会选择使用术语 unordered_mapstd::map 是一个有序的容器,stdext::hash_map,尽管有名字,但不是。

Microsoft 的编译器在完成对 C++11 的全面支持方面一直是最慢的,标准委员会已经完成了第二个变体 (C++14) 并正在研究第三个 (C++17)。微软即将在 VS2015 中完成 C++11 和 C++14 的大部分内容,但有一些重要的例外情况显然将成为 VS 编译器的主要问题(尤其是 constexpr 和模板变量)。

  1. Visual Studio2015不提供stdext-没了.这是不是那些 "well, it may eventually go away" 案例之一。

  2. stdext 特定于 Microsoft 编译器系列,因此使用 stdext:: 编写代码是不可移植的:http://ideone.com/x8GsKY

  3. 您想要的功能的标准化版本是 std::unordered_map,您应该使用它。本质上是一样的。

  4. stdext::hash_map 中存在未解决的错误。

如果您真的必须使用 stdext::hash_map,请通过添加

消除警告
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS

stdafx.h 的顶部我假设你的项目有,或者在你之前的头文件中 #include <stdext/...>,或者在解决方案资源管理器中:

  • 在解决方案资源管理器中右键单击您的项目条目,
  • Select 属性,
  • Select 配置:All Configurations,
  • 展开 C/C++ 树条目,
  • Select Preprocessor,
  • "Preprocessor Definitions"大概会说<different options>
  • 在 "Preprocessor Definitions" 条目的开头添加 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;,使其显示为 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;<different options>。 (或者原本应该跟在 ; 之后的任何东西)

看来你用的是旧的"std_lib_facilities.h" header (stroustrup.com/Programming/std_lib_facilities.h).

此 header 的新版本,在 MSVS 2015 中完美运行 "hello,world"-程序,可在 stroustrup.com/Programming/PPP2code/std_lib_facilities.h

学习PPP遇到同样的问题时发现了。