Ugrás a tartalomhoz

precompiled header

A Wikiszótárból, a nyitott szótárból


Főnév

precompiled header (tsz. precompiled headers)

  1. (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?

  1. A fejlesztő megjelöl egy fejlécfájlt (például pch.h), amely tartalmazza a gyakran használt include-okat.
  2. A fordító ezt a fájlt lefordítja külön egy .pch állománnyá.
  3. A többi .cpp fájl ezt a .pch fá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árakat
  • pch.cpp: ebben csak a #include "pch.h" sor szerepel – ez generálja a .pch fájlt

Példa:

pch.cpp

#include "pch.h"

A projektbeállításban:

  • C/C++ > Precompiled Headers: Use (/Yu) minden más .cpp fá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 #include a 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.