Wat is het PCH-bestandsformaat?
Een .pch-bestand is een vooraf gecompileerde header - een binaire compiler-cache die automatisch wordt gegenereerd tijdens het build-proces. In plaats van grote header-bestanden zoals de Windows SDK of stdafx.h bij elke compilatie-eenheid opnieuw te parsen, serialiseert de compiler zijn interne status - symbooltabellen, AST-nodes, macro-definities, include-guard flags - naar een .pch-snapshot. Opeenvolgende compilatie-eenheden laden die snapshot direct, wat de build-tijden voor grote C- en C++-projecten drastisch verkort.
MSVC produceert .pch-bestanden via de /Yc compiler-flag, meestal vanuit een specifiek stub-bronbestand genaamd pch.cpp of stdafx.cpp. Clang slaat zijn vooraf gecompileerde headers op als een gecomprimeerde LLVM-bitstream ingebed in een systeemeigen objectbestand in een sectie genaamd __clangast. Het equivalent van GCC gebruikt de extensie .gch in plaats van .pch.
Het formaat is volledig compiler-intern - bedrijfseigen, binair en niet overdraagbaar tussen machines. Een .pch-bestand wordt ongeldig zodra de compilerversie, compiler-flags of een van de opgenomen headers wijzigt; het build-systeem genereert het automatisch opnieuw. Typische groottes variëren van 10 MB tot meer dan 200 MB wanneer de Windows SDK-headers zijn inbegrepen.
Gebruikers maken of openen .pch-bestanden nooit handmatig. Het verwijderen ervan is veilig - de volgende build maakt het opnieuw aan, en een schone herbouw (clean rebuild) is de standaardoplossing voor hardnekkige PCH-gerelateerde fouten. C++20 Modules verminderen gedeeltelijk de afhankelijkheid van vooraf gecompileerde headers in nieuwe codebases, maar .pch blijft het dominante mechanisme voor compilatiesnelheid in bestaande C- en C++-projecten.
Beveiliging & veiligheid
RISICO: LOWEen .pch is een intern build-artefact van de compiler. Het kan geen code uitvoeren en wordt niet uitgevoerd door het besturingssysteem. Geen betekenisvolle aanvalsvector; het bestand wordt lokaal gegenereerd door het build-systeem en is machine-specifiek.
Formaatdetails
in een notendop- Apple Xcode Prefix Header - Xcode (vóór Swift) gebruikte een .pch prefix-header (bronbestand, niet binair) om Objective-C headers vooraf te compileren; het concept is hetzelfde, maar het bestand is een tekstheader, niet de binaire output.
Programma's die PCH-bestanden openen
Technische details
diepe specificaties| Bestandstype | Binaire compiler-cache (geserialiseerde AST- en symboolstatus) |
| Codering | Binair (compiler-interne representatie) |
| Byte-volgorde | Little-endian (MSVC op x86/x64); doelafhankelijk (Clang) |
| Container | Propriëtaire binaire blob (MSVC); COFF/ELF/Mach-O objectbestand met ingebedde __clangast-sectie (Clang) |
| Compressie | Geen (MSVC); gecomprimeerde LLVM-bitstream, op zlib gebaseerd (Clang) |
| Typische grootte | 10 MB - 200 MB; Windows SDK PCH gewoonlijk 50-200 MB |
| MSVC-generatievlag | /Yc maakt de PCH aan; /Yu gebruikt deze in opeenvolgende compilatie-eenheden |
| Standaard bronbestand | stdafx.cpp of pch.cpp in MSVC-projecten |
| Machinespecificiteit | Niet overdraagbaar tussen machines; MSVC PCH bevat host-specifieke adresinformatie |
| Ongeldigverklaring | Wordt automatisch opnieuw gegenereerd wanneer de compilerversie, flags of een opgenomen header wijzigt |
| GCC-equivalent | .gch-extensie (GCC vooraf gecompileerde headers gebruiken geen .pch) |
| Versiedetectie | MSVC sluit een interne handtekening in; weigert verouderde PCH-bestanden bij een mismatch in versie of flags |
| C++20-opvolger | C++20 Modules (.ifc in MSVC) vervangen PCH gedeeltelijk in nieuwe codebases |
| Bijbehorend OS | Windows (MSVC), macOS (Xcode en Clang), Linux (Clang en GCC) |
| Uitgebracht | 1988 (Microsoft C Compiler 6.0 for MS-DOS, first PCH implementation); mainstream adoption with MSVC for Windows in the 1990s |
| Laatste versie | N/A - format is internal per compiler; MSVC PCH is regenerated by each compiler version |
| Specificatie | learn.microsoft.com |
Community V&A
gevraagd door gebruikersNog geen vragen - wees de eerste om iets te vragen over PCH-bestanden.