为什么#include <iostream.h>不好?


47

我正在阅读另一个线程,一个人向初学者询问有关C ++的书籍,一个回答的程序员写道:

警告:请避免所有带有“ hello world”字样的书都标明

#include <iostream.h>

我打开了我的C ++书,并确定它像上面的示例一样包含iostream标头。

为什么这么糟?学习C ++时,我还应牢记其他哪些指针?

背景:我精通C语言,下学期将开始学习C ++。


3
另一个相关的指针是包含cstdio,而不是stdio.h(不推荐使用)。
安东·戈洛夫

7
@AntonGolov意见不同。许多专家都喜欢<stdio.h>,因为没有技术上的原因为什么应该首选<cstdio>。
Sjoerd

2
@Sjoerd <cstdio>保证提供名称的事实namespace std足以让我偏爱它。我知道,这可能为他们提供在全局命名空间,正如<stdio.h> 可能提供他们namespace std。如果习惯于始终使用<c…>标题,这也是一致性的问题。对于某些标头,您将真的很想要这样做,因为它们例如通过附加的函数重载来增强C接口。
5gon12eder 2015年

Answers:


58

头iostream.h是非标准头,并非在所有平台上都存在。事实上,它在我的系统上不存在(使用g ++和GNU libstdc ++)。因此,任何使用它的代码都将无法在我的系统上编译。

iostream.h使用的头是共同的前C ++是在1998年首先标准化但由于所使用的98标准<iostream>的代替<iostream.h>,后者已经失宠的(即非标和全部),并且不再所有平台都支持。使用该代码的代码应被视为非标准旧代码,并且不可移植。教它的书应该被认为是过时的,应避免使用。


14
我不会仅仅因为琐碎的预处理程序语法问题而直接避免读一本书。这可能是一本很棒的书,而一本糟糕的书可能正在使用现代语法。
Tydus勋爵,11年

21
@Lord Tydus任何给定的98年前的书籍都可能是一本好书的事实并不能否认这样一个事实,从统计学上讲,您最好避免使用98年前的书籍。
Mike Nakis 2011年

12
@LordTydus:完全不同意。C ++的样式和用法与98中的样式和用法不同,因此它不仅解决了语法问题。
马丁·约克

7
@LordTydus如果旧的语法简单明了,并且根本无法在现代编译器上编译,那么使用一本讲授旧语法的书将很难。请注意,任何讲解iostream.h用法的书都肯定不会讲例如名称空间,因此即使将iostream.h替换为iostream,您的代码也无法使用。如果您每次想从书中汇编示例时都必须通过Google搜索或就SO寻求帮助,那不是学习C ++的非常有效的方法。
sepp2k 2011年

3
@LordTydus:总的来说,我发现使用此类标题的书也倾向于使用错误的做法,并且充满错误。我采取收集这类书籍的目的只是为了使它们不流通。
greyfade

55

#include <iostream.h>表示这本书是在1998年第一个C ++标准之前编写的(标准标头是iostream)。

问题在于,较旧的C ++代码倾向于以当今被认为是不好的做法来编写。尤其是,

  • 使用C样式的数组,而不是像std::string和这样的容器类std::vector
  • 使用显式close函数而不是RAII。

iostream.h1998年前的一本书会出错不是最坏的事情,但1998年前的一本书会出错是第一件事。


14
在您的最后一段中将其钉住。
与莫妮卡(Monica)进行的轻度比赛

1

也许这有点晚了,但是ls /usr/{local/,}include/c++/*根据您的布局和路径,在unix / linux上可以做什么或类似的价钱。您可以通过管道grep查找有问题的标题,例如:

ls /usr/{local/,}include/c++/* | grep iostream 

这需要查找iostream.h以及其他任何超字符串。

或运行find / -type f -name iostream 2> /dev/null | grep includelocate iostream | grep include(如果数据库是当前数据库,否则以调用为前缀updatedb)-但是,它们还将打印非系统范围内的包含文件,因此请进行适当调整。实际的C ++包含路径很容易找到,例如:

g++ -v 2>&1| sed -rn 's/.+gxx-include[^=]+=([^ ]+).+/\1/p' # adjust iff empty

等效于Windows和其他计算机。我想这个主意很明确- iostream.h默认情况下,系统中不再存在的此类文件不再包含默认路径,但是您仍然可以找到带有iostream.h软链接iostream或作为其副本的旧版libc ++发行版。因此,这不是风格问题,而是环境问题。您可以iostream.h随项目一起提供您自己的项目,只需确保它包含在编译器查找<...>标头的包含路径中即可。


1
非常实用,但并未真正解决真正的基本问题。
莫妮卡(Monica)与Lightness竞赛

-1

只是丢下我的2美分。我认为“ .h”与书本质量之间没有关联。这是一个较小的语法问题。过去,它实际上是正确的语法。

iostream.h是否可以有一本好书?是

iostream可能会带来一本糟糕的书吗?是

我将依靠在线用户评论(以及阅读后的我自己的评论)来判断一本书的质量。


3
问题是,您确定要从“回到过去”读一本书吗?
hugomg 2011年

5
Lisp是从1958年开始过时的吗?尽管数学已有数千年的历史,但我们在每个现代导弹系统中都利用了毕达哥拉斯的工作。在当前的C ++书籍市场中,“。h”书籍可能非常糟糕。但这是书籍的质量,而不是“ .h”问题。“ .h”甚至不是编程逻辑,而是用于预处理器的。
Tydus勋爵,11年

4
但是有人第一次学习该语言时,会知道这本书告诉他们什么地方不对吗?在发现“ .h”现在不正确之前,他们将经历多少时间和沮丧?书还以其他几种方式过时了?
克里斯·皮特曼

23
问题是自从编写这些书以来,C ++的使用已发生了巨大变化。您思考和使用C ++的全部方式与这些书所呈现的方式不同,因为它们没有现代C ++所具有的任何功能。结果,您将使用类而不是C ++来教自己使用C。
马丁·约克

3
@乔治:很无聊。那ACRE呢?Ritalin的高级C(带例外)。英亩还意味着它覆盖了很多土地。:-)
马丁·约克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.