Sobes.tech
Junior

Prečo ne píšeme kód v hlavičkovom súbore?

sobes.tech AI

Odpoveď od AI

Kód v hlavičkových súboroch (.h alebo .hpp v C++) sa neumiestňuje z nasledujúcich dôvodov:

  1. Porušenie pravidla jednej definície (One Definition Rule - ODR). Keď viacero súborov .cpp zahrnie hlavičkový súbor obsahujúci spustiteľný kód, bude tento kód definovaný viacnásobne, čo povedie k chybe pri linkovaní (multiple definition). Výnimkou sú funkcie inline a šablóny tried/funkcií, ktoré musia byť definované v každom prekladačskom module, kde sa používajú.

    // priklad.h
    int g_counter = 0; // Globálna premenná - porušenie ODR
    
    void my_function() { // Funkcia - porušenie ODR
        // kód
    }
    
    inline void my_inline_function() { // inline funkcia - výnimka
        // kód
    }
    
    template<typename T>
    void process(T value) { // šablóna funkcie - výnimka
        // kód
    }
    
  2. Zvýšenie doby kompilácie. Pri každom zahrnutí hlavičkového súboru, prekladač ho znova spracováva. Umiestnenie kódu do hlavičkových súborov zvyšuje záťaž pre prekladač a spomaľuje proces zostavovania projektu, najmä v veľkých projektoch.

  3. Zložitosť údržby a testovania. Kód rozptýlený v hlavičkových súboroch sa stáva menej modulárny. To sťažuje testovanie jednotlivých komponentov a ich nezávislé zmeny.

  4. Riziko cyklických závislostí (include loops). Nesprávna organizácia zahrnutí s kódom v hlavičkových súboroch môže viesť k cyklickým závislostiam a problémom s kompiláciou.

V hlavičkových súboroch sa zvyčajne deklarujú:

  • Triedy (definície, ale nie implementácie metód)
  • Funkcie (prototypy)
  • Globálne premenné (s použitím extern)
  • Konštanty
  • Šablóny tried a funkcií (úplné definície)
  • inline funkcie (úplné definície)
  • Typy dát (struct, enum, typedef, using)
  • Priestor mien (namespace)

Implementácia kódu (tela funkcií, definície statických členov tried a globálnych premenných) sa umiestňuje do príslušných súborov implementácie (.cpp).