預編譯標頭 將穩定、龐大、頻繁包含的標頭檔 (如 MFC/ATL/STL/Boost 標頭) 預先編譯為二進制中間格式 (.pch),後續編譯單元直接載入,跳過重複解析,大幅縮短建置時間。
| 檔案 | 角色 | 內容 |
|---|---|---|
StdAfx.h (或 pch.h) | 預編譯標頭 內容定義 | 包含所有需預編譯的標頭:afxwin.h, windows.h, vector, string, 專案通用標頭等 |
StdAfx.cpp (或 pch.cpp) | 觸發預編譯的 編譯單元 | 僅一行:#include "StdAfx.h" (必須為第一行非註解代碼) |
.pch | 編譯器產出的 二進制快照 | 內含符號表、型別資訊、模板實例化等,供其他 .cpp 載入 |
StdAfx.cpp → 產生 Project.pch (及 StdAfx.obj)。.cpp 編譯時,若第一行非註解為 #include "StdAfx.h",編譯器直接載入 .pch,跳過對 StdAfx.h 及其遞迴包含標頭的解析。StdAfx.h 變更,重新編譯 StdAfx.cpp 更新 .pch,後續 .cpp 自動受益。C/C++ → Precompiled Headers → Create (/Yc),指定 StdAfx.h。Use (/Yu),指定相同 StdAfx.h。Not Using Precompiled Headers。.cpp 第一行非註解 必須 是 #include "StdAfx.h"。StdAfx.h 內部不再包含其他會變動的專案標頭。target_precompile_headers、/Yc//Yu 自動管理,檔案常命名為 pch.h/pch.cpp。.cpp 為單一編譯單元) + PCH,極致加速。#include 都搬到 StdAfx.h」→ 引入不必要依賴、增加耦合、修改一行觸發全編。.cpp 內再次包含 StdAfx.h 以外的系統標頭」→ 破壞 PCH 命中,重複解析。import std; 取代 #include,根治重複解析,為終極替代者 (VS/MSVC/GCC/Clang 逐步支援)。ccache / sccache:分散式編譯快取,跨機器共享。Clang modules / PCH 跨編譯器相容模式。StdAfx.h/.cpp 是 MSVC 經典 PCH 機制的慣用命名。核心邏輯:「穩定標頭集中放、專用 cpp 觸發編譯、其他 cpp 強制首包、修改標頭重編觸發器」。科學配置可獲 3-10 倍編譯加速;濫用則成維護噩夢。C++20 Modules 時代到來前,PCH 仍是大型 C++ 專案不可或缺的加速器。