#include <iostream.h>が悪いのはなぜですか?


47

私は別のスレッドを読んでいたが、ある男が初心者向けにC ++の本について尋ね、プログラマーの一人がこれを書いた。

いくつかの警告:「hello world」を示すすべての本を避ける

#include <iostream.h>

C ++ブックを開いて、上記の例のようなiostreamヘッダーが含まれていることを確認しました。

なぜそれが悪いのですか?C ++を学習するとき、他にどのような留意点がありますか?

背景:私はCに精通しており、次の学期にC ++を学び始めます。


3
別の関連ポインタは、含むことであるcstdio、ではないstdio.h(後者は推奨されています)。
アントンゴロフ

7
@AntonGolov意見は異なります。<cstdio>を優先すべき技術的な理由がないため、多くの専門家は<stdio.h>を優先しています。
シェード

2
@Sjoerd <cstdio>名前を提供することが保証されているという事実はnamespace std、私がそれを好むのに十分な理由です。私はそれがかもしれないことを知っても、同じようにグローバル名前空間にそれらを提供する<stdio.h> 可能性がある中でそれらを提供しますnamespace std。常に<c…>ヘッダーを使用することを習慣にする場合も、一貫性の問題です。また、一部のヘッダーでは、たとえば、追加の関数オーバーロードでCインターフェイスが強化されるため、これが本当に必要になります。
5gon12eder

回答:


58

ヘッダーiostream.hは非標準ヘッダーであり、すべてのプラットフォームに存在するわけではありません。実際のところ、私のシステムには存在しません(g ++とGNU libstdc ++を使用)。したがって、それを使用するコードは、システム上でコンパイルされません。

iostream.hC ++は、最初1998年に標準化しかし、98標準のために使用される前にヘッダが共通に使用される<iostream>代わりに<iostream.h>、後者は(非標準およびすべてである)好意から落ちていない、もはやすべてのプラットフォーム上でサポートされています。それを使用するコードは、非標準のレガシーコードと見なされるべきであり、移植性はありません。それを教える本は時代遅れであると見なされ、避けるべきです。


14
些細なプリプロセッサ構文の問題のために、私は本を完全に避けません。ひどい本が現代の構文を使用している間、それは素晴らしい本であるかもしれません。
主Tydus

21
@Lord Tydus 98年以前の本すばらしい本になる可能性があるという事実は、統計的には、98年以前の本を避けたほうがよいという事実を否定するものではありません。
マイクナキス

12
@LordTydus:まったくそう思わない。C ++のスタイルと使用法は98と同じではないため、構文の問題を修正するだけではありません。
マーティンヨーク

7
@LordTydus古い構文が単純で、最新のコンパイラーで単純にコンパイルされない場合、古い構文を教えている本を使用するのは難しいでしょう。iostream.hの使用法を教えている本はほとんど確実に名前空間なども教えていないので、iostream.hをiostreamに置き換えた後でもコードは機能しません。この本からサンプルをコンパイルするたびに、Googleで検索したり、SOに関するヘルプを求めたりする必要がある場合、C ++を学習するのにあまり効果的な方法ではありません。
sepp2k

3
@LordTydus:一般的に、私はそのようなヘッダーを使用する本も悪い習慣を使用する傾向があり、エラーに満ちていることを発見しました。私は、それらを流通させないために、その
greyfade

55

#include <iostream.h>は、本が1998年に最初のC ++標準より前に書かれたことを示す記号です(標準ヘッダーはですiostream)。

問題は、古いC ++コードは、今日悪い習慣と考えられる方法で記述される傾向があることです。特に、

  • std::stringやなどのコンテナクラスではなく、Cスタイルの配列を使用しますstd::vector
  • closeRAIIではなく明示的な関数の使用。

iostream.h1998年以前の本が間違っているのは最悪のことではありませんが、1998年以前の本が間違っているのは最初の可能性が高いでしょう。


14
あなたの最後の段落でそれを打ちました。
モニカとの軽さのレース14

1

多分これは少し遅れますが、Unix / Linuxボックスではls /usr/{local/,}include/c++/*、レイアウトとパスに応じて、それが価値のあることです。次の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
非常に実用的ですが、実際の基本的なポイントに実際には対応していません。
モニカとの軽さのレース14

-1

ちょうど私の2セントを落とします。「.h」と本の品質の間に相関関係があるとは思わない。これは小さな構文の問題です。昔は、実際には正しいsytnaxでした。

iostream.hで素晴らしい本を入手することは可能ですか?はい

iostreamでひどい本を持つことは可能ですか?はい

本の品質を判断するには、オンラインユーザーレビュー(および読んだ後の自分のレビュー)に依存します。


3
問題は、「昔の本」が本当に欲しいのですか?
hugomg

5
Lispは1958年からのものだから時代遅れですか?私たちは、数学が数千年前であっても、すべての現代のミサイルシステムでピタゴラスの仕事を活用しています。現在のC ++ブック市場では、「。h」ブックはひどい場合があります。しかし、それは本の質の問題であり、「。h」の問題ではありません。「.h」はプログラミングロジックではなく、プリプロセッサ用です。
主Tydus

4
しかし、初めて言語を学ぶ人は、本が彼らに間違ったことを伝えていることを知っていますか?「.h」が正しくないことを知るまでにどれだけの時間とフラストレーションを経験しますか?また、この本は古くなっていますか?
クリスピットマン

23
問題は、これらの本が書かれてからC ++の使用法が大きく変わったことです。C ++が持っている機能をまったく持っていないため、C ++を考えて使用する全体の方法は、これらの本が示すものと同じではありません。その結果、C ++ではなくクラスを使用してCを自習することになります。
マーティンヨーク

3
@ジョルジオ:退屈。ACREはどうですか。例外を伴うリタリンの高度なC。エーカーはまた、それが多くの地面をカバーすることを意味します。:
マーティンヨーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.