C++の前置き宣言
2402 ワード
事前宣言前言 前置き声明は何ですか 前置き宣言 の使用方法なぜ前置声明 を使用するのかなぜ前置声明 を使用しないのかまとめ 参考資料 前言
今日から数年前に翻訳されたGoogleスタイル仕様を見て、「含める必要があるヘッダファイルの数を大幅に減らすことができる」という前置き声明を知ったので、検索していくつかの文章を読んで、最後に現在のGoogleスタイル仕様が推奨されていないことに気づいた.この1編は3時間ほど書きましたが、クリップボードで上書きされ、書き直すのに1時間以上かかりました.
前の宣言は何ですか.
「前置宣言」(forward declaration)は、クラス、関数、テンプレートの純粋な宣言であり、定義は伴っていません.
クラスの宣言(.h)ファイルで別のクラスを使用するには、自然にヘッダファイルを直接含む方法と、前の宣言の2つがあります.次のようにしてコンパイルできますが、なぜでしょうか.
前置き宣言の使用方法
前置き宣言要件:宣言されたクラスがファイルで宣言されたクラスのデータメンバーである場合、オブジェクトメンバーではなくポインタメンバーまたは参照メンバーです.宣言されたクラスがファイルで宣言されたクラスのメンバー関数のパラメータまたは戻り値である場合、この関数はファイルに定義されません. 宣言されたクラスがファイルで宣言されたクラスのデータメンバーである場合、コンパイラが空間を申請する際に定義が必要であるため、ポインタに必要な空間は固定されている(参照の実装もポインタに基づいている).宣言されたクラスがファイルで宣言されたクラスのメンバー関数のパラメータまたは戻り値である場合、関数の宣言はクラスの定義に使用されないため、関数の定義はクラスの定義に使用される可能性が高い.しかし、一般的には、関数の定義が極めて短い場合を除き、メンバー関数の宣言と定義は一般的に分離される.hファイルと.cppファイルにあるので、宣言されたクラスがファイルで宣言されたクラスのメンバー関数のパラメータであるか、値を返すときに前置き宣言を使用できると言えます.
前置き宣言を使用する理由 2 2 2つのクラスが互いにヘッダファイルを含む場合、コンパイルに失敗します.(必須) は、クラスの宣言および定義ファイルを分離するのに役立ちます.(.cppファイルのみinclude.hファイル)(パーソナルスタイル) コンパイル時間を節約します.(あるヘッダファイルを修正した後、複数の依存ファイルをコンパイルする必要がある)(必要に応じて) 前置き宣言を使用しない理由
Google C++スタイル仕様を引用
前置き宣言の使用はできるだけ避けます.前置き宣言は依存関係を隠し、ヘッダファイルが変更されると、ユーザーのコードは必要な再コンパイルプロセスをスキップします. の事前宣言は、ライブラリの後続の変更によって破壊される可能性があります.先行宣言関数またはテンプレートは、ヘッダファイル開発者がAPIを変更するのを妨げる場合があります.たとえば、パラメータタイプを拡大したり、デフォルトのパラメータを持つテンプレートパラメータを追加したりします. 前置き宣言ネーミングスペースstd::のsymbolからの場合、その動作は定義されません. 極端の場合、includesの代わりに前置声明を使用すると、コードの意味が暗く変更されます. は、ヘッダファイルからのsymbolが多く宣言されている場合、1行のincludeよりも冗長になります. は、オブジェクトメンバーの代わりにポインタメンバーを使用するなど、事前に宣言できるようにコードを再構築するだけで、コードをより遅く複雑にします.
注記:「再コンパイルプロセスをスキップ」と「極端な状況」は、次のとおりです.cppファイルには前置き宣言が使用する、includeを最小化する場合に発生する、個人的には.hファイルでは前置声明を用いて依存を低減し,前置声明は有益で無害である.
まとめ
前置き宣言は、必要に応じてのみ使用し、定義ファイルでは使用しないことが望ましい.
参考資料
Google C++スタイル仕様(最新)readthedocs.io Googleプログラミング仕様(2016.07)csdn.Net C++中ヘッダファイル相互含むと前置き宣言_cnblogs.ヘッダーファイルを含む代わりに、前の宣言を使用する方法csdn.net
今日から数年前に翻訳されたGoogleスタイル仕様を見て、「含める必要があるヘッダファイルの数を大幅に減らすことができる」という前置き声明を知ったので、検索していくつかの文章を読んで、最後に現在のGoogleスタイル仕様が推奨されていないことに気づいた.この1編は3時間ほど書きましたが、クリップボードで上書きされ、書き直すのに1時間以上かかりました.
前の宣言は何ですか.
「前置宣言」(forward declaration)は、クラス、関数、テンプレートの純粋な宣言であり、定義は伴っていません.
クラスの宣言(.h)ファイルで別のクラスを使用するには、自然にヘッダファイルを直接含む方法と、前の宣言の2つがあります.次のようにしてコンパイルできますが、なぜでしょうか.
//foo.h
#pragma once
class bar;
class foo
{
public:
Bar getBar();
private
Bar* _bar;
};
前置き宣言の使用方法
前置き宣言要件:宣言されたクラスがファイルで宣言されたクラスのデータメンバーである場合、オブジェクトメンバーではなくポインタメンバーまたは参照メンバーです.宣言されたクラスがファイルで宣言されたクラスのメンバー関数のパラメータまたは戻り値である場合、この関数はファイルに定義されません. 宣言されたクラスがファイルで宣言されたクラスのデータメンバーである場合、コンパイラが空間を申請する際に定義が必要であるため、ポインタに必要な空間は固定されている(参照の実装もポインタに基づいている).宣言されたクラスがファイルで宣言されたクラスのメンバー関数のパラメータまたは戻り値である場合、関数の宣言はクラスの定義に使用されないため、関数の定義はクラスの定義に使用される可能性が高い.しかし、一般的には、関数の定義が極めて短い場合を除き、メンバー関数の宣言と定義は一般的に分離される.hファイルと.cppファイルにあるので、宣言されたクラスがファイルで宣言されたクラスのメンバー関数のパラメータであるか、値を返すときに前置き宣言を使用できると言えます.
前置き宣言を使用する理由
Google C++スタイル仕様を引用
前置き宣言の使用はできるだけ避けます.
// b.h:
struct B {};
struct D : B {};
// good_user.cc:
#include "b.h"
void f(B*);
void f(void*);
void test(D* x) { f(x); } // f(B*)
// #include B D , test() f(void*) 。
注記:「再コンパイルプロセスをスキップ」と「極端な状況」は、次のとおりです.cppファイルには前置き宣言が使用する、includeを最小化する場合に発生する、個人的には.hファイルでは前置声明を用いて依存を低減し,前置声明は有益で無害である.
まとめ
前置き宣言は、必要に応じてのみ使用し、定義ファイルでは使用しないことが望ましい.
参考資料
Google C++スタイル仕様(最新)readthedocs.io Googleプログラミング仕様(2016.07)csdn.Net C++中ヘッダファイル相互含むと前置き宣言_cnblogs.ヘッダーファイルを含む代わりに、前の宣言を使用する方法csdn.net