web-dev-qa-db-ja.com

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

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

一部の警告:「hello world」と表示されているすべての本は避けてください

#include <iostream.h>

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

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

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

48
Daniel Scocco

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

iostream.hヘッダーは、C++が1998年に最初に標準化される前は一般的でしたが、98標準以降は<iostream> の代わりに <iostream.h>、後者は支持されなくなっており(非標準ですべて)、すべてのプラットフォームでサポートされなくなりました。それを使用するコードは、非標準のレガシーコードと見なされるべきであり、移植性はありません。それを教える本は時代遅れであると考えられて、避けられるべきです。

58
sepp2k

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

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

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

iostream.hは、1998年以前の本が誤解する最悪ではないが、1998年以前の本が誤解する可能性が高い最初違う。

56
dan04

多分これは少し遅くなりますが、価値があるのは、レイアウトとパスに応じて、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 includeまたはlocate iostream | grep includeを実行します(データベースが最新の場合、それ以外の場合はupdatedbへの呼び出しを付加します)。ただし、これらはシステム全体ではないインクルードも出力します。適切に調整してください。実際のC++インクルードパスは、次のようなもので簡単に見つかります。

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

Windowsおよび他のマシンで同等。考えは明らかだと思います-iostream.hのようなファイルはデフォルトでシステムインクルードパスに存在しなくなりますが、iostream.hを使用して従来のlibc ++ディストリビューションを見つけることができます。 iostreamにリンクされているか、そのコピーとして。したがって、これはスタイルの問題ではなく、状況の問題です。独自のiostream.hをプロジェクトに同梱できます。コンパイラが<...>ヘッダーを検索するインクルードパスに含まれていることを確認してください。

1
Nicholas