預編譯頭文件(Precompiled Header,簡稱 PCH)是將專案中穩定、不常變更的程式碼(如標頭檔、巨集定義、內聯函數等)預先編譯成二進位檔案(通常為 .pch),後續編譯時直接載入,避免重複解析,大幅縮短建置時間。在 Visual C++ 6.0 時代,這項技術對大型 MFC 專案尤為關鍵。
雖然編譯器具備時間戳機制,僅重新編譯異動過的 .cpp 檔,但每個 .cpp 仍需完整處理其 #include 的所有標頭檔內容(巨集、前置處理器指令等)。預編譯頭將這部分共同資訊序列化儲存,讓編譯器跳過重複解析,效能提升顯著。
/Yc:指定建立預編譯頭的來源檔(通常為 StdAfx.cpp)。/Yu:指定使用現有的預編譯頭。/Fp:指定 .pch 輸出/讀取路徑與檔名。/Yx:自動使用預編譯頭(優先級低於 /Yc//Yu)。StdAfx.h),集中放置穩定的 #include(如 <afxwin.h>、<afxext.h> 等 MFC 核心標頭)。StdAfx.cpp,僅包含 #include "StdAfx.h"。/Fp "Debug/PCH.pch"。StdAfx.cpp 設定 /Yc "StdAfx.h"(建立)。.cpp 設定 /Yu "StdAfx.h"(使用)。/Yu 的每個 .cpp 必須在第一行 #include "StdAfx.h",否則會出現 Unexpected file end 錯誤。StdAfx.cpp(Ctrl+F7)即可重建,無須 Rebuild All。.pch 檔案通常有 6–7 MB,定期清除無用的預編譯頭可節省磁碟空間。在專案設定選擇 Automatic use of precompiled headers(對應 /Yx),編譯器會嘗試自動偵測並套用。但若專案已手動指定 /Yc//Yu,自動模式會被忽略。
善用預編譯頭能大幅降低大型 C/C++ 專案的編譯時間,核心在於「集中穩定標頭、指定建立/使用檔、確保包含順序」。雖然現代編譯器(如 MSVC、Clang、GCC)皆支援模組化與更先進的快取機制,但理解 PCH 原理仍有助於優化舊專案或嵌入式建置流程。