2010-11-29 19 views

答えて

43

大規模で複雑でコンパイルが遅いiostreamヘッダーそのものを#includeにせずに、iostream型の宣言に依存するメソッドを独自のヘッダーで宣言できるようになりました。

// foo.h 
#include <iosfwd> 

void sucker(std::iostream& is); 

 

// foo.cc 
#include <iostream> 

void sucker(std::iostream& is) { 
    is >> somevar; 
} 
+0

は、あなたはそれが参照を転送する方法を詳細に説明できますか? – wp2

+0

@ wp2:型を定義せずに型を宣言するだけです。なぜあなた自身の中にそれを覗いてみませんか?それはかなり小さいです。 –

+0

foo.hで直接実行するのではなく、foo.ccの '#include 'のbenifitは何ですか? – wp2

27

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

+0

次のコマンドの動作方法 $ echo '#include ' | g ++ -E -xC++ - | wc 次のコマンドを実行しようとしましたが、何らかのエラーが表示されます $ echo '#include ' | g ++ -E -xC++ - | wc どこが間違っていたのですか? – beparas

8

<iosfwd>を使用すると、コンパイル時の依存関係をなくしたいからです。

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

私は、このリンクはparticulary有用であることが判明: http://www.gotw.ca/gotw/007.htm

+2

これは、すでに存在する2歳以上の回答よりも洞察が深まります。 –

+0

私はこれがビルドの最適化であるという印象を受けました。「」をコンパイルするのに、「」よりもずっと短い時間がかかります。または、そのアプリケーションは、あなたが言っていたことの主な推進力ですか? – Hurkyl

関連する問題