当Stroustrup的书中包含std_lib时,不要理解VS中的HelloWorld错误

时间:2017-02-18 11:13:09

标签: c++ visual-studio visual-c++

我在Stroustrup的网站上加入了std_lib 我的代码是:

_

所以我有2个错误:

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

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

从书的开头那里使用“std_lib_facilities.h”,除了这个std_lib的路径之外,我的代码等同于本书。有人可以解释一下它的含义吗?可以随便一起阅读这本书。

2 个答案:

答案 0 :(得分:5)

std_lib_facilities.h是Stroustrup自己编写的头文件,可以是When opening in inspector, it also shows the formatted type。它是 不是标准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;
}

当时间到来时,请将#includestd_lib_facilities.h一起扔掉。

答案 1 :(得分:3)

用c ++编写这个的惯用方法是:

#include <iostream>

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

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