precompiled header
Főnév
precompiled header (tsz. precompiled headers)
- (informatika) A precompiled header (röviden: PCH, magyarul: előre lefordított fejlécfájl) a C és C++ fordítók optimalizálási technikája, amely lehetővé teszi, hogy a gyakran változatlan header fájlokat ne kelljen minden egyes fordításnál újra feldolgozni, hanem egyszer tárolt előfeldolgozott formában legyenek elérhetők.
🧠 Miért hasznos?
A nagyobb projektekben rengeteg szabványos vagy harmadik féltől származó könyvtárat használunk (pl. <iostream>, <vector>, vagy Windows.h). Ezek hatalmas fejlécfájlokat húznak magukkal, így a fordítási idő gyorsan megugrik.
👉 A precompiled header segít csökkenteni ezt a fordítási időt azáltal, hogy:
- csak egyszer dolgozza fel ezeket a fejlécfájlokat,
- a többi forrásfájl már csak a PCH fájlt használja.
⚙️ Hogyan működik?
- A fejlesztő megjelöl egy fejlécfájlt (például
pch.h), amely tartalmazza a gyakran használt include-okat. - A fordító ezt a fájlt lefordítja külön egy
.pchállománnyá. - A többi
.cppfájl ezt a.pchfájlt használja – sokkal gyorsabban, mint ha újra feldolgozná a tartalmat.
📄 Példa: alap PCH használat
pch.h – előre fordított fejléc
#ifndef PCH_H
#define PCH_H
#include <iostream>
#include <vector>
#include <map>
#include <string>
#endif
main.cpp
#include "pch.h"
int main() {
std::vector<int> szamok = {1, 2, 3};
std::cout << "Méret: " << szamok.size() << "\n";
}
Fordítás GCC-vel (példa):
g++ -x c++-header pch.h -o pch.h.gch
g++ -include pch.h main.cpp -o program
🛠️ PCH támogatása fejlesztőkörnyezetekben
| Fejlesztőkörnyezet | Támogatás típusa |
|---|---|
| Visual Studio | Automatikusan kezeli (stdafx.h / pch.h) |
| GCC / Clang | Manuálisan beállítható (-x c++-header, -include) |
| CMake | target_precompile_headers() (CMake 3.16+) |
| Code::Blocks / CodeLite / QtCreator | Beépített támogatás vagy manuális |
🚨 Fontos szabályok
1. A .cpp fájloknak ugyanazzal a #include "pch.h"-val kell kezdeniük
Más sorrendű vagy eltérő include-ok hibát okozhatnak (pl. „not valid PCH” vagy „does not match PCH”).
2. A pch.h tartalma nem változhat gyakran
Különben a .pch fájlt minden változtatás után újra kell generálni.
3. Ne tegyél definíciót bele!
Csak deklarációk és include-ok legyenek benne – például globális változókat, inline függvényt ne helyezz bele, kivéve ha szabályosan használható minden egységben.
🧱 Visual Studio és PCH
Visual Studio-ban automatikusan létrejön egy pch.h és pch.cpp fájl.
pch.h: fejlécfájl, amiben include-oljuk a gyakori könyvtárakatpch.cpp: ebben csak a#include "pch.h"sor szerepel – ez generálja a.pchfájlt
Példa:
pch.cpp
#include "pch.h"
A projektbeállításban:
C/C++ > Precompiled Headers: Use (/Yu) minden más.cppfájlnál- Create (/Yc) csak
pch.cpp-nél
🧪 GCC / Clang példák
Előállítás:
g++ -x c++-header pch.h -o pch.h.gch
Használat:
g++ -include pch.h main.cpp -o program
Clang esetén hasonló a használat.
🧬 CMake és PCH (3.16+)
target_precompile_headers(myapp PRIVATE pch.h)
Ez automatikusan lefordítja pch.h-t, és csatolja a célhoz.
❌ PCH hátrányai
| Hátrány | Magyarázat |
|---|---|
| Törékeny | Ha bármely .cpp eltér a pch.h használatában, hiba |
| Lassú újragenerálás | A PCH fájl módosítása után az összes egység újrafordul |
| Platform- és fordítófüggő | Nem minden fordító kezeli ugyanúgy |
| Nincs típusellenőrzés | A hibák sokszor PCH miatt nehezebben követhetők |
🤔 Mikor érdemes használni?
Használd, ha:
- nagy projekten dolgozol
- sok az
#includea fájlok elején - sokszor fordítasz részleteket, nem az egészet
Ne használd, ha:
- kis projektről van szó
- fejlesztési fázisban gyakran változnak a
#include-ok - build rendszered nem támogatja jól
🎯 Összefoglalás
| Fogalom | Leírás |
|---|---|
| Precompiled Header (PCH) | Előfeldolgozott fejlécfájl, amely gyorsítja a fordítást |
| Használat | #include egy közös pch.h fájlt minden .cpp fájlban |
| Fordítók | GCC, Clang, MSVC támogatja |
| Előny | Drasztikus build időcsökkentés nagy projekteknél |
| Hátrány | Karbantartási nehézségek, beállítás érzékenység |
| Modern eszközök | CMake támogatás target_precompile_headers() által |
🔚 Zárógondolat
A precompiled header egy egyszerű, de hatékony módszer a C++ fordítási idejének optimalizálására, különösen nagy projekteknél. Ugyanakkor körültekintően kell használni: strukturált build rendszerrel, egységes kódstílussal és szigorú header-szabályok betartásával.
- precompiled header - Szótár.net (en-hu)
- precompiled header - Sztaki (en-hu)
- precompiled header - Merriam–Webster
- precompiled header - Cambridge
- precompiled header - WordNet
- precompiled header - Яндекс (en-ru)
- precompiled header - Google (en-hu)
- precompiled header - Wikidata
- precompiled header - Wikipédia (angol)