This question already has answers here:
C++ Hash Deprecation Warning

(3 个回答)


4年前关闭。




我从 Stroustrup 的网站中包含了 std_lib
我的代码是:
#include "c:\Users\theresmineusername\Documents\Visual Studio 2017\std_lib_facilities.h"

int main()
{
    cout << "Hello, World!\n";
    return 0;
}

所以我有两个错误:
1. E1574    статическое объявление не удалось по причине "<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."   ConsoleApplication2 c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.24930\include\hash_map

2. 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.  ConsoleApplication2 c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.24930\include\hash_map

从一开始就使用“std_lib_facilities.h”,除了这个std_lib的路径之外,我的代码与这本书等效。有人能解释一下是什么意思吗?可以用它继续阅读这本书。

最佳答案

std_lib_facilities.h 是 Stroustrup 自己编写的头文件,可以是 downloaded from www.stroustrup.com 。它是 不是标准的 C++ 头文件 但显然反射(reflect)了 Stroustrup 的想法,即在最初几周内对所有初学者隐藏甚至最简单的语言复杂性。

正如头文件本身所说:



我个人认为这是一个非常糟糕的主意,对 Bjarne Stroustrup 表示敬意,他是一个比我所向往的更伟大的天才。

头文件充满了被认为是糟糕的编程风格的东西(尤其是 using namespace std; ,它永远不应该在头文件的全局范围内使用,或者从标准容器类派生)。它还迎合了过时的编译器,这些编译器可能还不能正确支持 C++ 的某些"new"特性,使用了很多丑陋的预处理器指令。

头文件本身似乎已经过时了(我链接的那个文件已经有 7 年历史了),我不确定 Stroustrup 是否更新过它。

预处理器指令之一使您的编译器错误地包含 <hash_map> ,而它应该是 <unordered_map> 。当然,这很荒谬,因为您的程序只想打印一条 hello world 消息,甚至对哈希映射都不感兴趣。

以下是您的程序在 正确的 C++ 中的样子:

#include <iostream>

int main()
{
    std::cout << "Hello, World!\n";
    return 0;
}

(注意 return 0;main 中是可选的。)

但是,如果您想继续使用 Stroustrup 提供的 std_lib_facilities.h 学习帮助,无论如何您必须在几周内取消学习,那么请按照错误消息本身的说明进行操作:定义 _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS

最快的方法是在源代码中使用 #define:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include "c:\Users\theresmineusername\Documents\Visual Studio 2017\std_lib_facilities.h"

int main()
{
    cout << "Hello, World!\n";
    return 0;
}

时机成熟时,将其与 #includestd_lib_facilities.h 一起扔掉。

关于c++ - 当 Stroustrup 的书中包含 std_lib 时,不了解 VS 中 HelloWorld 上的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42314399/

10-13 08:13