ヒント ファイル
A ヒント ファイル Visual Studio のすることができます統合開発環境 (IDE) Visual C++ 識別子、関数とマクロの名前などを解釈します。Visual C++ プロジェクトは、IDE を開くと システムの解析 各ソース ファイルに、プロジェクト内のコードを分析し、すべての識別子に関する情報を収集します。IDE では、その情報を使用しての機能をサポートします、その クラス ビュー ブラウザーとは ナビゲーション バー.
導入された解析システムは、 Visual C++ 2010、C または C++ の構文を理解しますが、マクロを含むステートメントを誤って解釈することができます。場合マクロはソース コードに書き込まれると、構文的に正しい文を誤って認識する可能性します。ステートメントのソース コードがコンパイルされ、プリプロセッサによって置き換えられますと構文的に正しくなりますが マクロ識別子 定義します。 解析システムは、ヒント ファイルを使用してマクロを解釈するために、プロジェクトをビルドすることなくが動作します。 したがって、参照機能など クラス ビュー すぐに利用可能です。
ヒント ファイルにはユーザーがカスタマイズできるが含まれています ヒントは、C または C++ のマクロの定義と同じ構文があります。Visual C++ には、ほとんどのプロジェクトのための十分な組み込みのヒント ファイルが含まれていますが、Visual Studio 識別子を処理する方法を向上させるために、独自のヒント ファイルを作成することができます。
シナリオ
次のコードを確認ソース ファイルであることを前提としています、 クラス ビュー ブラウザーです。を STDMETHOD マクロという名前のメソッドを宣言しています。 myMethod 1 つのパラメーターを受け取りへのポインターを返しますが HRESULT.
//ソース コード ファイル。 STDMETHOD(myMethod) (int 型のパラメーター 1)。
次のマクロの定義内の別のヘッダー ファイルです。
//ヘッダー ファイル。 #define STDMETHOD(method) の HRESULT (STDMETHODCALLTYPE * メソッド) #define STDMETHODCALLTYPE _ _stdcall #define HRESULT void *
STDMETHOD という名前の関数を宣言するのには、表示されるため、ソース コード解析システムを解釈できないし、は 2 つのパラメーター リストがあるため、宣言の構文です。解析システムの定義を検出するのには、ヘッダー ファイルが開かない、 STDMETHOD, STDMETHODCALLTYPE、と HRESULT マクロ。解析システムを解釈できないため、 STDMETHOD マクロは、ステートメント全体を無視し、解析を継続します。
プロジェクトを 1 つまたは複数の重要なヘッダー ファイルに依存しているため、解析システムのヘッダー ファイルを使用しません。すべてのヘッダー ファイルを変更した場合、解析システムは、ヘッダー ファイル、IDE のパフォーマンスが低下する、プロジェクト内のすべての見直しを必要があります。代わりに、解析システムを処理する方法を指定するヒントを使用して、 STDMETHOD, STDMETHODCALLTYPE、と HRESULT マクロ。
方法のヒントが必要なことをご存知ですか。ヒントが必要な場合は、どのような種類は、作成する必要があります。ヒントが必要だということだ場合は、ビュー内の識別子 クラス ビュー ビュー内で一貫していない、 エディター.たとえば、 クラス ビュー 可能性があることがわかっているクラス メンバーが存在する、表示しない、またはメンバーの名前が正しくありません。一般的な問題を解決するヒントの種類の詳細については、どのようなマクロを必要とする、ヒントを参照してください?は、このトピックの後で。
アーキテクチャ
物理ディレクトリにヒント ファイルに関連する、論理ディレクトリしないに表示 ソリューション エクスプ ローラー.ヒント ファイルは、有効にするには、ヒント ファイルをプロジェクトに追加する必要はありません。解析システムは、ソース ファイルを解析する場合にヒント ファイルを使用します。
すべてのヒント ファイルを名前します。 cpp.hint.このため、多くのディレクトリにヒント ファイルを含めることができますが、特定のディレクトリにファイルを 1 つだけのヒントが発生することが。
プロジェクトは、0 個以上のヒント ファイルを影響します。ヒント ファイルがない場合は、解析システムはエラー回復手法を使用して解読できないソース コードを無視します。それ以外の場合、解析システムを見つけるし、ヒントを収集するのには、次の方法を使用します。
検索の順序
解析システム ディレクトリのヒント ファイルが次の順序で検索されます。
Visual C++ (のインストール パッケージを格納するディレクトリvcpackages).このディレクトリに頻繁に使用されるシステム ファイル内のシンボルのように説明する組み込みのヒント ファイルが含まれています。 windows.h.その結果、プロジェクトが自動的に必要なヒントのほとんどを継承します。
ソース ファイルのルート ディレクトリからソース ファイルを含むディレクトリへのパス。標準的な Visual C++ プロジェクトでは、ルート ディレクトリに、ソリューション ファイルまたはプロジェクト ファイルが含まれます。
この規則の例外がある場合は、 ファイルを停止します。 元のファイルへのパスです。ストップ ファイルは、検索順序の追加のコントロールが用意されていて、という名前は、ファイル cpp.stop.ルート ディレクトリから開始する代わりに、解析システムは、ストップ ファイルにソース ファイルが格納されているディレクトリを含むディレクトリから検索します。一般的なプロジェクトでは、ストップ ファイルは必要ありません。
ヒントの収集
0 個以上のヒント ファイルが含まれます。 ヒント.ヒント定義または、C または C++ のマクロと同様にだけを削除します。つまり、 #define プリプロセッサ ディレクティブを作成するか、ヒントを再定義し、 #undef ディレクティブでヒントを削除します。
解析システムは前に説明した検索順序で各ヒント ファイルを開き、各ファイルのヒントのセットに蓄積 効果的なヒント、をクリックし、有効ヒントを使用して、コード内の識別子を解釈します。
解析システムは、次の規則を使用してヒントを蓄積します。
新しいヒントが既に定義されていない名前を指定する場合は、新しいヒント、効果的なヒントに名前を追加します。
新しいヒントが既に定義されている名前を指定する場合は、新しいヒントによって既存のヒントを再定義します。
場合は、新しいヒントは、 #undef 既存の有効ヒントを指定ディレクティブ、新しいヒントによって既存のヒントが削除されます。
最初のルールは有効ヒント以前開いたヒント ファイルから継承されていることを意味します。最後の 2 つの規則のヒントは、検索順序で後で発生する以前に発生したヒントをオーバーライドすることができることを意味します。たとえば、ソース ファイルを含むディレクトリにヒント ファイルを作成する場合は、以前のヒントをオーバーライドできます。
ヒントの収集方法の描写を参照してください、 使用例 このトピックの後半のセクションです。
構文
ヒントが作成され、作成し、マクロを削除するプリプロセッサ ディレクティブと同じ構文を削除します。実際には、解析システムは、ヒントを評価するのには、C または C++ プリプロセッサを使用します。プリプロセッサ ディレクティブの詳細についてを参照してください。 #define のディレクティブ (C/C++) し #undef のディレクティブ (C/C++).
だけの特別な構文の要素が、 @<, @=、と @> 置換後の文字列。これらにのみ使用されるヒント ファイル固有の置換文字列です。 地図 マクロ。マップのデータ、関数、またはイベントのデータ、関数、またはイベント ハンドラーに関連するマクロのセットです。たとえば、 MFC マップを作成します。 メッセージ マップ、と ATL マップを作成します。 オブジェクト マップします。.ヒント ファイル固有の置換文字列は、マップの開始、中間、および終了要素を示しています。マップ マクロの名前だけが重要です。したがって、各置換文字列が意図的にマクロの実装を隠ぺいします。
ヒントは、次の構文を使用します。
構文 |
意味 |
---|---|
#defineヒント名前置換文字列 #defineヒント名前(パラメーター, ...)置換文字列 |
新しいヒントを定義したり、既存のヒントを再定義するプリプロセッサ ディレクティブ。出現 1 つずつ、プリプロセッサ ディレクティブの後を置き換えます ヒント名前 ソース コードに 置換文字列. 2 番目の構文形式は関数のようなヒントを定義します。ソース コードでの関数のようなヒントが発生する場合は、プリプロセッサの最初出現 1 つずつ置き換えられます。 パラメーター で 置換文字列 ソース コード、および、置換に対応する引数に ヒント名前 を 置換文字列. |
@< |
ヒント ファイルの特定 置換文字列 マップ要素のセットの開始を示します。 |
@= |
ヒント ファイルの特定 置換文字列 中間のマップ要素を示しています。マップに複数のマップ要素を持つことができます。 |
@> |
ヒント ファイルの特定 置換文字列 一連のマップ要素の終わりを示します。 |
#undefヒント名前 |
既存のヒントを削除するプリプロセッサ ディレクティブ。ヒントの名前によって提供されます、 ヒント名前 識別子です。 |
//コメント |
1 行コメント。 |
/*コメント*/ |
複数行のコメント。 |
どのようなマクロのヒントを必要とするか。
特定の種類のマクロ解析のシステムに干渉します。このセクションでは、問題が発生するマクロの種類と、この問題を解決するために作成することができますヒントの種類を説明します。
悪影響のあるマクロ
いくつかのマクロはソース コードを解釈するのには、解析システムですが、ブラウズ エクスペリエンスを損なうことなくが無視することができます。ソース コード コメント言語 (たとえば、SAL) のマクロ プログラミング バグを検索を解決するのに役立つ C++ 属性にします。コードを参照するときに SAL 注釈を無視する場合は、そのコメントを非表示にするヒント ファイルを作成します。
次のソース コードで、パラメーターの入力は、 FormatWindowClassName() 関数でください。 PXSTR、およびパラメーター名であります。 szBuffer.ただし、解析システムの誤り、 _Pre_notnull_ し _Post_z_ SAL 注釈は、パラメーターの型またはパラメーターの名前をします。
ソース コードを示します。
静的 void FormatWindowClassName(_Pre_notnull_ _Post_z_ PXSTR szBuffer)
方法: Null の定義
このような状況での戦略が存在しなかったかのように SAL 注釈を扱うことです。これを行うには、置換文字列が null のヒントを指定します。その結果、解析システムで注釈が無視され、 クラス ビュー ブラウザーには表示されません。(Visual C++ には SAL 注釈を非表示にする組み込みのヒント ファイルが含まれています)。
ヒントのファイル:
#define _Pre_notnull_
非表示の文字列の C または C++ 言語要素
C および C++ マクロを非表示にかどうか、解析システムでソース コードが間違って解釈される典型的な理由です。 区切り記号 または キーワード トークンです。マクロの 2 つの区切り記号を含める可能性があります。 <>, [], {}、と ().
次のソース コードは、 START_NAMESPACE マクロには、左中かっこのペアになっていない (非表示に{).
ソース コードを示します。
#define START_NAMESPACE MyProject の名前空間 {
方法: 直接コピー
マクロのセマンティクスが、ブラウズ エクスペリエンスが重要な場合は、マクロと同じヒントを作成します。ヒント ファイル内の定義は、マクロ解析システムを解決します。
ソース ファイル内のマクロのマクロが含まれている場合は、既に有効ヒントのセットである場合にのみマクロ解釈されるを確認します。
ヒントのファイル:
#define START_NAMESPACE MyProject の名前空間 {
地図
マップは、開始要素、終了要素、および 0 個以上の中間要素を指定するマクロから構成されます。解析システムは各マップ マクロ、C および C++ 言語要素を非表示に多くの別々 のマクロには完全な C または C++ のステートメントの構文を配布するためのマップ誤って解釈します。
次のソース コードを定義します。 BEGIN_CATEGORY_MAP, IMPLEMENTED_CATEGORY、と END_CATEGORY_MAP マクロ。
ソース コードを示します。
#define BEGIN_CATEGORY_MAP(x) 静的の const struct ATL::_ATL_CATMAP_ENTRY * GetCategoryMap() throw() {\ 静的 const 構造体 ATL::_ATL_CATMAP_ENTRY [pMap] {#define を =。 IMPLEMENTED_CATEGORY(catid){_ATL_CATMAP_ENTRY_IMPLEMENTED、& catid が、#define END_CATEGORY_MAP() \ {_ATL_CATMAP_ENTRY_END、NULL}}; \ (pMap) が返されます。 }
方法: マップの要素を識別します。
開始、中間 (存在する場合)、および終了のヒントを指定するマップの要素。特別なマップ置換文字列を使用します。 @<, @=、と @>.詳細についてを参照してください、 構文 このトピックのセクションです。
ヒントのファイル:
//スタートの地図。 #define BEGIN_CATEGORY_MAP(x) @<
/または中間の要素をマップします。 #define IMPLEMENTED_CATEGORY(catid) @=
/または中間の要素をマップします。 #define REQUIRED_CATEGORY(catid) @=
//マップを終了します。 #define END_CATEGORY_MAP() @>
複合マクロ
複合マクロには解析システムを混乱させる種類のマクロのいずれかが含まれています。
次のソース コードが含まれています、 START_NAMESPACE マクロは、名前空間のスコープを指定し、 BEGIN_CATEGORY_MAP マクロは、マップの開始を指定します。
ソース コードを示します。
#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP
方法: 直接コピー
ヒントを作成します。 START_NAMESPACE し BEGIN_CATEGORY_MAP マクロ、し、ヒントを作成します。 NSandMAP 以前のバージョンのソース コードを示すように同じですマクロです。また、複合マクロ破壊的マクロと空白のみで構成されて 場合は、置換文字列が null 定義ではヒントを定義できます。
この例では、前提としています。 START_NAMESPACE このトピックで説明されているようにヒントを既に持っている、 非表示の文字列の C または C++ 言語要素 小見出し。仮定 BEGIN_CATEGORY_MAP ヒント」で説明されているようであります。 地図.
ヒントのファイル:
#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP
不都合マクロ
解析システムでは、いくつかのマクロを解釈することができますが、ソース コードがマクロが長いまたは複雑であるために読み込むことが困難です。読みやすくするため、マクロの表示を簡略化するためのヒントを提供することができます。
ソース コードを示します。
#define STDMETHOD(methodName) の HRESULT (STDMETHODCALLTYPE * methodName)
方法: 効率化
シンプルなマクロ定義を表示するためのヒントを作成します。
ヒントのファイル:
methodName void * #define STDMETHOD(methodName)
使用例
次の使用例は、ヒント ファイルからヒントを集計する方法を示しています。この例では、ストップ ファイルは使用されません。
次の図は Visual C++ プロジェクトの物理ディレクトリの一部を示しています。ヒント ファイルは、 vcpackages, デバッグ, A1、と A2 ディレクトリです。
ヒント ファイルのディレクトリ
ディレクトリとファイルの内容のヒント
ヒント ファイル、およびそれらのヒント ファイルの内容が含まれているディレクトリにこのプロジェクトを次に示します。多数のヒントをいくつかは、 vcpackages ヒント ファイルのディレクトリが表示されます。
ディレクトリ |
ヒント ファイルの内容 |
---|---|
vcpackages |
|
デバッグ |
|
A1 |
|
A2 |
|
効果的なヒント
このプロジェクト内のソース ファイルに対して有効ヒントの例を次に示します。
ソース ファイル |
効果的なヒント |
---|---|
A1_A2_B.cpp |
|
次の注意事項は、上の表に適用されます。
効果的なヒントからです、 vcpackages, デバッグ, A1、と A2 ディレクトリです。
を #undef ディレクティブに、 デバッグ ヒント ファイルを削除します。 #define _In_ ヒントを vcpackages ディレクトリのヒント ファイル。
ヒント ファイルで、 A1 ディレクトリの再定義 START_NAMESPACE.
を #undef ヒントを A2 ディレクトリは削除のヒント OBRACE し CBRACE で、 デバッグ ディレクトリのヒント ファイル。
参照
関連項目
概念
Visual C++ プロジェクトに対して作成されるファイルの種類