web-dev-qa-db-ja.com

<iosfwd>ヘッダーとは何ですか?

<iosfwd> header 使用されるのは?なぜそれが必要なのですか?

何か例は?

65
wp2

これは、独自のヘッダーで、iostreamヘッダー自体に#includeする必要がないiostreamタイプの宣言に依存するメソッドを宣言できるようにするためのものです。

以下に簡単な例を示します。

// foo.h
#include <iosfwd>

void sucker(std::iostream& is);

// foo.cc
#include <iostream>

void sucker(std::iostream& is) {
    is >> somevar;
}
58
Marcelo Cantos

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

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

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

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

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

# 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行のコードを処理する必要があります。これは、ソースファイルで気にする実際のコードをコンパイルする前です。

34
Adam Rosenfield

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

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

私はこのリンクが特に役立つと感じました: http://www.gotw.ca/gotw/007.htm

12
Lesswire