2013-05-12 14 views
15

私はC++を学び始めました。文字列型はコンパイラに直接組み込まれていないので、<string>ヘッダーファイルを使用する必要があると書いた本を読んでいます。 <iostream>を使用する場合は、文字列タイプを使用できます。#<string>#<iostream>の横に#includeを使用する必要がありますか?

<iostream>ヘッダーを含めると文字列タイプを使用する場合、<string>ヘッダーを含める必要がありますか?どうして?いくつかの違いはありますか?

答えて

17

はい、使用する内容を含める必要があります。標準ヘッダーには(IIRCを除いて)いくつかのヘッダーが含まれることは必須ではありません。今は動作するかもしれませんが、別のコンパイラでは失敗する可能性があります。

あなたのケースでは、明らかに<iostream>には、直接的または間接的に<string>が含まれていますが、それには頼っていません。

+0

これはおそらく文字列の前方宣言です(にはが含まれ、これにはgccの実装が含まれています)。私はそれが標準的な振る舞いだと思うので(標準をチェックしなければならないだろう)、彼は完全なタイプが必要ないときに彼がそれに頼ることができると信じています。 – Aleph

+0

@AnotherTest "私は文字列型を使用できます" - 完全型が必要であることを伝えます。彼がしなければ、前方宣言はそうするでしょう、はい。 –

+0

27.5.1には、にはが含まれている必要があります。それは 'char_traits'だけ必要なので、コンパイラが' string'を宣言しなければならないかどうかはわかりません。私はまだiostreamの実装に文字列ヘッダ全体が含まれているのではないかと疑います。 – Aleph

7

私は<iostream>ヘッダが含まれている場合、文字列型を使用したい場合<string>ヘッダーを含める必要がありますか?

はい、する必要があります。他のヘッダー(例:<iostream>)を介して間接的に関連するヘッダー(例:<string>)を#includeに頼ることはできませんが、一部の実装ではそうかもしれません。

そして、これがすべてではない、いくつかの演算子の関連する過負荷のがインポートされている場合、またはクラスは、ヘッダあなた#includeにフォワード宣言されている場合、しかし上の情報、それはトラブルにつながる可能性があり、仕事にを見えるかもしれませんでも他のクラスから派生したクラスは、#include dを取得しないヘッダーにのみ含まれます。

このような状況の例としては、たとえばthis Q&A on StackOverflowを参照してください。

+0

[ios_base :: getloc](http://en.cppreference.com/w/cpp/io/ios_base/getloc)は値で 'std :: locale'を返し、[locale :: name](http: /en.cppreference.com/w/cpp/locale/locale/name)は 'std :: string'を値で返します。実際に' std :: string'を完全に定義するには '#include 'が実際に必要です。 「」の非会員のみがオプションです。 – Cubbi

+0

非常に良い点。私が使用しているライブラリのコードがこれに依存していたところで、非常に古いOS /コンパイラから新しいバージョンにアップグレードしたときに、コンパイルがこれ以外の理由がないために壊れたという問題が発生しました。 – user320781

関連する問題