私は 別のスレッド を読んでいて、初心者向けのC++の本について男が尋ねたところ、答えたプログラマーの一人がこれを書いた:
一部の警告:「hello world」と表示されているすべての本は避けてください
#include <iostream.h>
私はC++ブックを開いたところ、確かに上記の例のようなiostreamヘッダーが含まれていました。
なぜそれが悪いのですか? C++を学習するとき、他にどのような注意点がありますか?
背景:私はCに習熟しており、次の学期にC++を学び始めます。
ヘッダーiostream.hは非標準ヘッダーであり、すべてのプラットフォームに存在するわけではありません。実際のところ、これは私のシステムには存在しません(g ++とGNU libstdc ++を使用)。したがって、それを使用するコードは、私のシステムではコンパイルできません。
iostream.h
ヘッダーは、C++が1998年に最初に標準化される前は一般的でしたが、98標準以降は<iostream>
の代わりに <iostream.h>
、後者は支持されなくなっており(非標準ですべて)、すべてのプラットフォームでサポートされなくなりました。それを使用するコードは、非標準のレガシーコードと見なされるべきであり、移植性はありません。それを教える本は時代遅れであると考えられて、避けられるべきです。
#include <iostream.h>
は、この本が1998年の最初のC++標準より前に書かれたことを示す記号です(標準ヘッダーはiostream
です)。
問題は、古いC++コードが、今日の悪習と見なされる方法で記述される傾向があることです。特に、
std::string
やstd::vector
などのコンテナクラスではなく、Cスタイルの配列を使用します。close
関数の使用。iostream.h
は、1998年以前の本が誤解する最悪ではないが、1998年以前の本が誤解する可能性が高い最初違う。
多分これは少し遅くなりますが、価値があるのは、レイアウトとパスに応じて、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
をプロジェクトに同梱できます。コンパイラが<...>
ヘッダーを検索するインクルードパスに含まれていることを確認してください。