答えて
大規模で複雑でコンパイルが遅いiostreamヘッダーそのものを#include
にせずに、iostream型の宣言に依存するメソッドを独自のヘッダーで宣言できるようになりました。
// foo.h
#include <iosfwd>
void sucker(std::iostream& is);
// foo.cc
#include <iostream>
void sucker(std::iostream& is) {
is >> somevar;
}
が述べた@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行のコードを処理する必要があります。これは、ソースファイルで気になる実際のコードをコンパイルする前です。
次のコマンドの動作方法 $ echo '#include
<iosfwd>
を使用すると、コンパイル時の依存関係をなくしたいからです。
従来のストリームヘッダー(<iostream>
およびフレンド)の代わりに<iosfwd>
を使用すると、ストリーミング全体の定義を含めないようにできます。 <iosfwd>
を使用すると、すべてのストリーミング用のものだけが前方宣言されます。
私は、このリンクはparticulary有用であることが判明: http://www.gotw.ca/gotw/007.htm
これは、すでに存在する2歳以上の回答よりも洞察が深まります。 –
私はこれがビルドの最適化であるという印象を受けました。「
- 1. 「生のHTTPヘッダー」とは何ですか? "HTTPヘッダー"と "生のHTTPヘッダー"の違いは何ですか?
- 2. REST APIのヘッダーとは何ですか?
- 3. x-Application-Contextヘッダーとは何ですか?
- 4. X-Backside-Transportヘッダーとは何ですか?
- 5. 固定ヘッダーと固定ヘッダーの違いは何ですか?
- 6. 1 << 0とは何ですか?
- 7. Swiftでは+++と<<<は何ですか?
- 8. Rubyでは "<< - "とは何ですか?たとえば
- 9. aspxの<%:と<%=と<%#の違いは何ですか?
- 10. ''は<alias>とは何ですか?
- 11. PHPで "<<< SQL"とは何ですか?
- 12. ISecureDataFormat <TData>とは何ですか?
- 13. Nullable <T>とは何ですか?
- 14. Vec <_>とは何ですか?
- 15. <aaa>とは何ですか?
- 16. httpd <defunct>とは何ですか?
- 17. <%$ %> asp.netマークアップタグとは何ですか?
- 18. 「<Module>」タイプとは何ですか?
- 19. ヘッダーまたは何ですか?
- 20. Cの<と<<の違いは何ですか?
- 21. <_wmi_namespace:<COMObject <unknown>>とは何ですか?
- 22. では、<xsl:if test = "。[foo or @bar]">とは何か、クロスブラウザソリューションとは何ですか?
- 23. cout << coutとcout <<とcoutの違いは何ですか?
- 24. 以下のコードスニペットでf.write << TEMPLATEとは何ですか?
- 25. Outlook連絡先エクスポートのCSVヘッダーとは何ですか?
- 26. 'ヘッダー:{"Content-Type":XXX} "と" contentType:XXX "の違いは何ですか?
- 27. IMAPMessage.getUID()とMessage-IDヘッダーの違いは何ですか?
- 28. HTTPヘッダーのConnectionとProxy-connectionの違いは何ですか?
- 29. テキストファイルの生データをpandasデータフレームに読み込む方法は?</p> <p>見出し1::何とか</p> <p>見出し2:何とか</p> <p>見出し3:何とか何とか何とか何とか何とか何とか何とか何とか何とか何とか何とか何とか何とか何とか何とか
- 30. iPod Touchアプリケーションの開発用ヘッダーとは何ですか?このヘッダーは「SBStatusBarDataManager;」ですか?
は、あなたはそれが参照を転送する方法を詳細に説明できますか? – wp2
@ wp2:型を定義せずに型を宣言するだけです。なぜあなた自身の中にそれを覗いてみませんか?それはかなり小さいです。 –
foo.hで直接実行するのではなく、foo.ccの '#include'のbenifitは何ですか? –
wp2