从 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 <iostream>
,然后说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 是否更新过它。
预处理器指令之一使您的编译器错误地包含<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;
到时候把它和#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 的书
要查询book表中所有书名中包含“计算机”的书籍情况,可用 啥语句?