Che cos'è il formato di file PCH?
Un file .pch è un'intestazione precompilata - una cache binaria del compilatore generata automaticamente durante il processo di build. Invece di rianalizzare file header pesanti come il Windows SDK o stdafx.h in ogni unità di compilazione, il compilatore serializza il suo stato interno - tabelle dei simboli, nodi AST, definizioni di macro, flag include-guard - in uno snapshot .pch. Le unità di compilazione successive caricano direttamente quello snapshot, riducendo drasticamente i tempi di build per grandi progetti C e C++.
MSVC produce file .pch tramite il flag del compilatore /Yc, tipicamente da un file sorgente stub dedicato chiamato pch.cpp o stdafx.cpp. Clang memorizza le sue intestazioni precompilate come un bitstream LLVM compresso incorporato all'interno di un file oggetto nativo in una sezione denominata __clangast. L'equivalente di GCC utilizza l'estensione .gch anziché .pch.
Il formato è interamente interno al compilatore - proprietario, binario e non trasferibile tra macchine. Un file .pch viene invalidato ogni volta che la versione del compilatore, i flag del compilatore o qualsiasi header incluso cambiano; il sistema di build lo rigenera automaticamente. Le dimensioni tipiche variano da 10 MB a oltre 200 MB quando sono inclusi gli header del Windows SDK.
Gli utenti non creano né aprono mai i file .pch manualmente. Eliminarne uno è sicuro - la build successiva lo ricreerà, e una ricompilazione pulita è il rimedio standard per errori PCH persistenti. I Moduli C++20 riducono parzialmente la dipendenza dalle intestazioni precompilate nei nuovi codebase, ma il .pch rimane il meccanismo di velocità di compilazione dominante nei progetti C e C++ esistenti.
Sicurezza e incolumità
RISCHIO: LOWUn .pch è un artefatto di build interno del compilatore. Non può eseguire codice e non viene eseguito dal sistema operativo. Nessun vettore di attacco significativo; il file è generato localmente dal sistema di build ed è specifico per la macchina.
Dettagli del formato
in sintesi- Apple Xcode Prefix Header - Xcode (pre-Swift) utilizzava un prefix header .pch (file sorgente, non binario) per precompilare gli header Objective-C; il concetto è lo stesso ma il file è un header testuale, non l'output binario.
Programmi che aprono file PCH
Dettagli tecnici
specifiche approfondite| Tipo di file | Cache binaria del compilatore (AST serializzato e stato dei simboli) |
| Codifica | Binario (rappresentazione interna al compilatore) |
| Ordine dei byte | Little-endian (MSVC su x86/x64); dipendente dal target (Clang) |
| Contenitore | Blob binario proprietario (MSVC); file oggetto COFF/ELF/Mach-O con sezione __clangast incorporata (Clang) |
| Compressione | Nessuna (MSVC); bitstream LLVM compresso, basato su zlib (Clang) |
| Dimensione tipica | 10 MB - 200 MB; il PCH del Windows SDK è comunemente di 50-200 MB |
| Flag di generazione MSVC | /Yc crea il PCH; /Yu lo consuma nelle unità di compilazione successive |
| File sorgente predefinito | stdafx.cpp o pch.cpp nei progetti MSVC |
| Specificità della macchina | Non trasferibile tra macchine; il PCH di MSVC include informazioni sugli indirizzi specifiche dell'host |
| Invalidazione | Rigenerato automaticamente quando cambiano la versione del compilatore, i flag o qualsiasi header incluso |
| Equivalente GCC | Estensione .gch (le intestazioni precompilate di GCC non usano .pch) |
| Rilevamento versione | MSVC incorpora una firma interna; rifiuta i file PCH obsoleti in caso di mancata corrispondenza di versione o flag |
| Successore C++20 | I Moduli C++20 (.ifc in MSVC) sostituiscono parzialmente il PCH nei nuovi codebase |
| OS associato | Windows (MSVC), macOS (Xcode e Clang), Linux (Clang e GCC) |
| Rilasciato | 1988 (Microsoft C Compiler 6.0 for MS-DOS, first PCH implementation); mainstream adoption with MSVC for Windows in the 1990s |
| Ultima versione | N/A - format is internal per compiler; MSVC PCH is regenerated by each compiler version |
| Specifica | learn.microsoft.com |
Domande e risposte della community
chiesto dagli utentiAncora nessuna domanda - sii il primo a chiedere informazioni sui file PCH.