Sobes.tech
Junior

Kāpēc mēs ne rakstām kodu galvenes failā?

sobes.tech AI

Atbilde no AI

Kods galvenes failos (.h vai .hpp C++) nav izvietots šādu iemeslu dēļ:

  1. ** Viena definīcijas principa pārkāpums (One Definition Rule - ODR).** Iekļaujot galvenes failu vairākos .cpp failos, tajā esošais izpildāmais kods tiks definēts vairāk nekā vienu reizi, kas novedīs pie saites kļūdas (daudzkārtēja definēšana). Izņēmums – inline funkcijas un šablonu klases/funkcijas, kuras jādefinē katrā transliācijas modulī, kur tās tiek izmantotas.

    // example.h
    int g_counter = 0; // Globāla mainīgā - ODR pārkāpums
    
    void my_function() { // Funkcija - ODR pārkāpums
        // kāds kods
    }
    
    inline void my_inline_function() { // inline funkcija - izņēmums
        // kāds kods
    }
    
    template<typename T>
    void process(T value) { // Šablona funkcija - izņēmums
        // kāds kods
    }
    
  2. Kompilācijas laika palielināšana. Katru reizi iekļaujot galvenes failu, kompilators to pārstrādā no jauna. Koda izvietošana galvenes failos palielina kompilatora darba apjomu, palēninot projekta būvniecības procesu, īpaši lielos projektos.

  3. Atbalsta un testēšanas sarežģītība. Kods, izkaisīts pa galvenes failiem, kļūst mazāk modulārs. Tas apgrūtina atsevišķu komponentu testēšanu un to neatkarīgu maiņu.

  4. Cikla iekļaušanas riska (include loops). Nepareiza iekļaušanas organizācija ar kodu galvenes failos var novest pie cikliskām atkarībām un problēmām ar kompilāciju.

Galvenes failos parasti tiek deklarēti:

  • Klases (definīcijas, bet ne metožu realizācijas)
  • Funkcijas (prototipi)
  • Globālas mainīgās (ar extern)
  • Konstantes
  • Šablonu klases un funkcijas (pilni definīcijas)
  • inline funkcijas (pilni definīcijas)
  • Datu tipi (struct, enum, typedef, using)
  • Vārdu telpas (namespace)

Koda realizācija (funkciju ķermeņi, statisko locekļu un globālo mainīgo definīcijas) tiek izvietota atbilstošajos realizācijas failos (.cpp).