【问题标题】:C++ Hash Deprecation WarningC++ 哈希弃用警告
【发布时间】:2015-05-25 03:24:27
【问题描述】:

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

严重性代码描述项目文件行错误 C2338 是 已弃用并将被删除。请使用 。你可以 定义 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 以确认 您已收到此警告。

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

【问题讨论】:

  • 你用的是什么编译器?看来您没有使用 GNU C++ 编译器(g++)
  • 看起来像 Visual Studio 错误。将_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 放入您的预处理器定义中。这应该在项目设置的 c/c++ 部分中。
  • 不要使用<hash_map><hash_set>
  • 请注意,Stroustrup 提供了此文件的更新版本,该文件通过解决此问题的所述书的新修订版来解决此问题。你可以找到它here

标签: c++ deprecated deprecation-warning


【解决方案1】:

警告不是关于“某些功能”——而是关于整个stdext。而且它不仅仅是手动操作,最终会停产,已弃用:它不随 2015 年发布。

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

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

根据微软的提议,容器应该是std::hash_map,但是C++委员会选择使用unordered_map这个词。 std::map 是一个有序容器,stdext::hash_map 尽管有名字,但不是。

Microsoft 的编译器在完成对 C++11 的完整支持方面是最慢的,标准委员会已经完成了第二个变体 (C++14),并且正在开发第三个 (C++17)。微软即将在 VS2015 中完成 C++11 和 C++14 的一大块,除了一些明显的例外,这些例外显然将成为 VS 编译器的主要问题(尤其是 constexpr 和模板变量)。

  1. Visual Studio 2015 不提供stdext - 它已经消失了这不是那些“好吧,它最终可能会消失”的案例之一。

  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/...>,或者在解决方案资源管理器中:

  • 在解决方案资源管理器中右键单击您的项目条目,
  • 选择属性,
  • 选择配置:All Configurations
  • 展开C/C++ 树条目,
  • 选择Preprocessor
  • “预处理器定义”可能会显示<different options>
  • 在“预处理器定义”条目的开头添加_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;,使其读取为_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1;<different options>。 (或者原来的任何东西都应该遵循;

【讨论】:

  • @TerryYanko 既然喜欢,可以接受kfsone的回答。
【解决方案2】:

您可以在包含生成警告的标头之前进行定义:

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include <hash_map>

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

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

【讨论】:

    【解决方案3】:

    您似乎使用了旧的“std_lib_facilities.h”标头(stroustrup.com/Programming/std_lib_facilities.h)。

    此标头的新版本可在 MSVS 2015 中完美运行“hello,world”程序,可在 stroustrup.com/Programming/PPP2code/std_lib_facilities.h

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 2021-07-12
      相关资源
      最近更新 更多