PCH ファイル形式とは?
.pch ファイルはプリコンパイル済みヘッダーであり、ビルドプロセス中に自動生成されるバイナリ形式のコンパイラキャッシュです。コンパイル単位ごとに Windows SDK や stdafx.h などの巨大なヘッダーファイルを再解析する代わりに、コンパイラはその内部状態(シンボルテーブル、AST ノード、マクロ定義、インクルードガードフラグなど)を .pch スナップショットとしてシリアル化します。後続のコンパイル単位はこのスナップショットを直接ロードするため、大規模な C および C++ プロジェクトのビルド時間を劇的に短縮できます。
MSVC は通常、pch.cpp または stdafx.cpp という名前の専用スタブソースファイルから、/Yc コンパイラフラグを介して .pch ファイルを生成します。Clang はプリコンパイル済みヘッダーを、ネイティブオブジェクトファイルの __clangast という名前のセクションに埋め込まれた圧縮 LLVM ビットストリームとして保存します。GCC の同等形式は、.pch ではなく .gch 拡張子を使用します。
この形式は完全にコンパイラ内部のものであり、プロプライエタリなバイナリで、マシン間での転送はできません。.pch ファイルは、コンパイラのバージョン、コンパイラフラグ、または含まれるヘッダーのいずれかが変更されるたびに無効化され、ビルドシステムによって自動的に再生成されます。一般的なサイズは 10 MB から、Windows SDK ヘッダーが含まれる場合は 200 MB 以上に及ぶこともあります。
ユーザーが手動で .pch ファイルを作成したり開いたりすることはありません。削除しても安全です。次回のビルドで再作成されます。また、永続的な PCH 関連のエラーに対する標準的な解決策は、クリーン再ビルドです。C++20 モジュールは、新しいコードベースにおいてプリコンパイル済みヘッダーへの依存を部分的に減らしますが、既存の C および C++ プロジェクトでは依然として .pch が主要なコンパイル高速化メカニズムです。
セキュリティと安全性
リスク: LOW.pch はコンパイラ内部のビルド成果物です。コードを実行することはできず、OS によって実行されることもありません。有意な攻撃ベクトルはありません。ファイルはビルドシステムによってローカルで生成され、マシン固有のものです。
形式の詳細
概要- Apple Xcode プリフィックスヘッダー - Xcode(Swift 以前)は、Objective-C ヘッダーをプリコンパイルするために .pch プリフィックスヘッダー(バイナリではなくソースファイル)を使用していました。概念は同じですが、ファイルはバイナリ出力ではなくテキストヘッダーです。
PCH ファイルを開くプログラム
技術的詳細
詳細仕様| ファイルタイプ | バイナリコンパイラキャッシュ(シリアル化された AST およびシンボル状態) |
| エンコーディング | バイナリ(コンパイラ内部表現) |
| バイト順序 | リトルエンディアン(x86/x64 上の MSVC)、ターゲット依存(Clang) |
| コンテナ | プロプライエタリなバイナリブロブ(MSVC)、__clangast セクションが埋め込まれた COFF/ELF/Mach-O オブジェクトファイル(Clang) |
| 圧縮 | なし(MSVC)、圧縮 LLVM ビットストリーム、zlib ベース(Clang) |
| 一般的なサイズ | 10 MB - 200 MB。Windows SDK PCH は通常 50-200 MB |
| MSVC 生成フラグ | /Yc で PCH を作成、/Yu で後続のコンパイル単位で使用 |
| デフォルトのソースファイル | MSVC プロジェクトにおける stdafx.cpp または pch.cpp |
| マシン固有性 | マシン間での転送不可。MSVC PCH にはホスト固有のアドレス情報が含まれます |
| 無効化条件 | コンパイラのバージョン、フラグ、または含まれるヘッダーが変更されると自動的に再生成 |
| GCC の同等形式 | .gch 拡張子(GCC のプリコンパイル済みヘッダーは .pch を使用しません) |
| バージョン検出 | MSVC は内部署名を埋め込み、バージョンやフラグの不一致時に古い PCH ファイルを拒否します |
| C++20 後継機能 | C++20 モジュール(MSVC では .ifc)が新しいコードベースで PCH を部分的に置き換えます |
| 関連 OS | Windows (MSVC), macOS (Xcode および Clang), Linux (Clang および GCC) |
| リリース日 | 1988 (Microsoft C Compiler 6.0 for MS-DOS, first PCH implementation); mainstream adoption with MSVC for Windows in the 1990s |
| 最新バージョン | N/A - format is internal per compiler; MSVC PCH is regenerated by each compiler version |
| 仕様書 | learn.microsoft.com |
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。PCH ファイルについて最初の質問をしてみましょう。
よくある質問
.pch ファイルとは何ですか?削除しても大丈夫ですか?
.pch ファイルに関するエラーが出るのはなぜですか?
.pch ファイルをソース管理(Git など)にコミットすべきですか?
.gitignore に *.pch を追加してください。.pch ファイルはどうやって開きますか?
.h ファイル(Visual Studio プロジェクトでは stdafx.h や pch.h)を参照してください。.pch は Visual Studio だけで使われますか?
.pch 拡張子の主要な利用者です。Clang も .pch 拡張子で PCH ファイルを作成します。GCC は代わりに .gch を使用します。各コンパイラの形式には互換性がありません。