Miért nem írunk kódot a fejlécfájlba?
sobes.tech MI
Válasz az MI-től
A fejlécfájlokban (.h vagy .hpp C++-ban) nem szabad elhelyezni a kódot a következő okok miatt:
-
Az egyetlen definíció szabályának (One Definition Rule - ODR) megsértése. Amikor több
.cppfájl tartalmaz egy fejlécfájlt, amely végrehajtható kódot tartalmaz, az több mint egyszer lesz definiálva, ami linker hibához vezet (többszörös definíció). Kivétel azinlinefüggvények és a sablon osztályok/függvények, amelyeket minden fordítási egységben definiálni kell, ahol használják.// példa.h int g_counter = 0; // Globális változó - ODR megsértése void my_function() { // Függvény - ODR megsértése // kód } inline void my_inline_function() { // inline függvény - kivétel // kód } template<typename T> void process(T value) { // sablon függvény - kivétel // kód } -
A fordítási idő növelése. Minden alkalommal, amikor egy fejlécfájlt beillesztenek, a fordító újra feldolgozza annak tartalmát. A kód fejlécfájlokba helyezése növeli a fordító terhelését, és lassítja a projekt összesítését, különösen nagy projektek esetén.
-
A karbantartás és tesztelés bonyolultsága. A fejlécfájlokban szétszórt kód kevésbé moduláris lesz. Ez megnehezíti az egyes komponensek tesztelését és azok független módosítását.
-
A ciklikus include-olások (include loops) kockázata. A rosszul szervezett include-olások a fejlécfájlokban ciklikus függőségekhez és fordítási problémákhoz vezethetnek.
A fejlécfájlokban általában deklarálják:
- Osztályokat (definíciók, de nem metódusok implementációi)
- Függvényprototípusokat
- Globális változókat (
externhasználatával) - Állandókat
- Osztály- és függvény sablonokat (teljes definíciók)
inlinefüggvényeket (teljes definíciók)- Adattípusokat (
struct,enum,typedef,using) - Névtereket (
namespace)
A kód implementációja (függvények törzse, statikus osztálytagok és globális változók definíciói) a megfelelő implementációs fájlokban (.cpp) kerül elhelyezésre.