84

<iosfwd>ヘッダーは何に使用されますか?なぜそれが必要なのですか?

例はありますか?

4

3 に答える 3

78

#includeこれは、大きくて複雑でコンパイルが遅い iostream ヘッダー自体を使用することなく、iostream 型の宣言に依存するメソッドを独自のヘッダーで宣言できるようにするためです。

簡単な例を次に示します。

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);

 

// foo.cc
#include <iostream>

void sucker(std::iostream& is) {
    is >> somevar;
}
于 2010-11-29T03:54:58.167 に答える
44

@Marcelo Cantosが述べたように、完全な定義を含めずに iostream クラスと関数の宣言を含めることができるようにするためです。C および C++ では、宣言は「ここに何か (関数/クラス/など) の名前がありますが、その名前以外については何も説明しません」というステートメントです。関数の場合、それは関数の名前を意味しますが、関数のコードを含む本体ではありません。クラスの場合、それはクラスの名前を意味しますが、クラスのメンバー変数やメソッドは意味しません。

逆に、定義は完全な定義 (関数本体、クラス メンバーなど) です。

多くの場合、使用する何かの宣言のみが必要です。関数の場合、呼び出すために関数の本体がどのように見えるかを知る必要はありません (テンプレート化された関数またはインライン化された関数の場合を除く)。同様に、クラスの場合、そのクラスのインスタンスへのポインターまたは参照を渡すだけであれば、クラスが持つメンバーを知る必要はありません。しかし、メンバー変数にアクセスしたり、クラス メソッドを呼び出したりする必要がある場合は、完全な定義が必要になります。

定義の代わりに宣言のみを含めることにより、コンパイラが処理する必要があるコードの総量がはるかに少なくなり、コンパイルがはるかに迅速に進行します。

処理されているコードの量を把握するために、ローカル実装に含まれるコードの量を次に示します。

# The following commands create a source file that includes a single header
# file (on stdout), preprocess it with g++ -E, and then count how many lines
# are in the resulting preprocessed output
$ echo '#include <iosfwd>' | g++ -E -xc++ - | wc
    2598    6534   57875
$ echo '#include <iostream>' | g++ -E -xc++ - | wc
   25631   59613  631998

を含むファイルでは<iosfwd>、コンパイラはさまざまなヘッダー ファイルから 2598 行のコードを処理する必要がありますが、 を含むファイルでは<iostream>なんと 25631 行のコードを処理する必要があります。それは、ソース ファイルで関心のある実際のコードをコンパイルする前です。

于 2010-11-29T04:12:51.160 に答える
17

基本的に使用する<iosfwd>のは、コンパイル時の依存関係を排除したいからです。

<iosfwd>ストリーミング全体の定義を含めることを避けることができるように、従来のストリーム ヘッダー (<iostream>および friends )の代わりに使用します。あなた<iosfwd>はすべてのストリーミングのものを前向きに宣言しているだけです。

このリンクが特に役立つことがわかりました: http://www.gotw.ca/gotw/007.htm

于 2013-07-17T08:33:09.447 に答える