PCH ファイルの使用時の一貫性規則
/Yu コンパイラ オプションを使用すると、使用するプリコンパイル済みヘッダー (PCH) ファイルを指定できます。
PCH を使うと、特に指定しない限り、コンパイラ オプションやプラグマなどのコンパイル環境が PCH 生成時の状態と同じだと見なされて、コードがコンパイルされます。矛盾する箇所が検出されると、警告が出力されます。矛盾箇所の内容が示される場合もあります。ただし、この警告は単に矛盾を示しているだけなので、必ずしも PCH に問題があるとは限りません。PCH に対する一貫性の要件については、以下のセクションで説明します。
コンパイラ オプションの一貫性
次のコンパイラ オプションでは、PCH を使用する場合に矛盾が生じる場合があります。
/D (プリプロセッサ) オプションでマクロを作成した場合は、PCH のコンパイル時と同じマクロを今回のコンパイルにも使う必要があります。定義した定数の状態はチェックされませんが、定数を変更すると予測できない結果を生じることがあります。
/E オプションや /EP オプションでは、PCH を使うことはできません。
PCH の作成には、/FR (ブラウザー情報の生成) または /Fr (ローカル変数の除外) を使用する必要があります。この PCH を使う以降のコンパイルでは、これらのオプションを使うことはできません。
C 7.0 互換 (/Z7)
PCH の作成時にこのオプションを有効にしておくと、この PCH を使う以降のコンパイル時にデバッグ情報を使用できます。
PCH の作成時に /Z7 オプションを有効にしていない場合は、以降のコンパイルで PCH と /Z7 オプションを併用すると、矛盾に対して警告が発行されます。このとき、デバッグ情報は現在の .obj ファイルに格納されるため、デバッガーでは PCH で定義されているローカル シンボルを使用できません。
インクルード パスの一貫性
PCH 自体には、PCH の生成時に有効であったインクルード パスに関する情報は含まれていません。.pch ファイルを使用すると、現在のコンパイルで指定されたインクルード パスが必ず使用されます。
ソース ファイルの一貫性
.PCH ファイルを使ってソース コードをコンパイルする (/Yu オプション) と、プリコンパイル対象のソース コード内のプリプロセッサ ディレクティブ (プラグマを含む) がすべて無視されます。したがって、これらのプリプロセッサ ディレクティブで指定するコンパイルは、.PCH ファイルの作成 (/Yc オプション) 時と同じ内容にする必要があります。
プラグマの一貫性
PCH の作成時に処理されたプラグマは、通常、その PCH でコンパイルされるファイルにも反映されます。ただし、comment プラグマと message プラグマは、PCH を使ったコンパイルには反映されません。
以下のプラグマは PCH の一部として保持され、PCH を使った以降のコンパイルに反映されます。
alloc_text |
include_alias |
pack |
auto_inline |
init_seg |
pointers_to_members |
check_stack |
inline_depth |
setlocale |
code_seg |
inline_recursion |
vtordisp |
data_seg |
intrinsic |
警告 |
機能性 |
optimize |
|