从 Stroustrup 的书中包含 std_lib 时,不理解 VS 中 HelloWorld 上的错误 [重复]

Posted

技术标签:

【中文标题】从 Stroustrup 的书中包含 std_lib 时,不理解 VS 中 HelloWorld 上的错误 [重复]【英文标题】:Don't understand errors on HelloWorld in VS when included std_lib from Stroustrup's book [duplicate] 【发布时间】:2017-02-18 11:13:09 【问题描述】:

我包含了 Stroustrup 网站上的 std_lib 我的代码是:

#include "c:\Users\theresmineusername\Documents\Visual Studio 2017\std_lib_facilities.h"

int main()

    cout << "Hello, World!\n";
    return 0;

所以我有 2 个错误:

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 的路径之外,我的代码与本书等效。有人可以解释这是什么意思吗?可以带着它继续阅读这本书。

【问题讨论】:

1.) 将错误作为文本复制并粘贴到问题中。不要将屏幕截图用于错误消息。 2.) 我不认为 Stroustrup 教授不正确的标题用法。您必须使用#include &lt;iostream&gt;,然后说std::cout 而不是cout 仔细观察,我发现 Stroustrup 确实在他的书中使用了如此可怕的头文件,包括一个丑陋的using namespace std;。这是一种非常奇怪的教学方式,因为它教会了你很多以后必须改掉的坏习惯。 @christian-hackl 知道了!更新的问题。在书的开头,他使用了自己的标题。 查看第二条消息“你可以定义_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS来确认你收到了这个警告。” 我已经删除了我的近距离投票并将我的反对票变成了赞成票,因为它现在对初学者来说是一个公平的问题,并且准确地描述了许多初学者可能遇到的问题。 【参考方案1】:

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

正如头文件本身所说:

这个标题主要是为了让你不必理解 每个概念一次完成。

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

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

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

预处理器指令之一使您的编译器错误地包含&lt;hash_map&gt;,而它应该是&lt;unordered_map&gt;。当然,这很荒谬,因为您的程序只想打印一条 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;

到时候把它和#include一起扔掉,换成std_lib_facilities.h

【讨论】:

Nitpick: return 0; from main() 不是必需的。 @πάνταῥεῖ:我直接在代码 sn-p 下方这么说! :) 啊,第一眼没发现。 它的工作。谢谢你。当我在#include.. 之后添加#define... 时它仍然是一个错误,但在这种情况下(相反)一切都很好。【参考方案2】:

用 c++ 写这个的惯用方式是:

#include <iostream>

int main() 
    std::cout << "Hello World!\n";

不应使用书中示例中的头文件。

【讨论】:

这是真的。但在这种情况下,一般会在阅读中丢失一个特定的点,因为它被用于 Stroustrup 的书中的很大一部分。

以上是关于从 Stroustrup 的书中包含 std_lib 时,不理解 VS 中 HelloWorld 上的错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++内存模型char vs word,并发?来自 Stroustrup 的书

Bjarne Stroustrup 语录1

要查询book表中所有书名中包含“计算机”的书籍情况,可用 啥语句?

从 UIPageViewContoller 中包含的视图设置 UINavigationBar 标题

如何从节点包中包含 css/js 文件?

从单独的文件中包含一个 Ruby 类