Sobes.tech
Junior

Ինչու չենք գրում կոդը գլխագրի ֆայլում?

sobes.tech AI

Պատասխան AI-ից

Код у загалоўкавых файлаў (.h або .hpp у C++) не размяшчаюць па наступных прычынах:

  1. Парушэнне прынцыпу аднаго вызначэння (One Definition Rule - ODR). Пры ўключэнні загалоўка файла некалькімі .cpp файламі, змяшчальны ў ім выконвальны код будзе вызначаны больш за адзін раз, што прывядзе да памылкі лінкоўкі (multiple definition). Вынятак – inline функцыі і шаблоны класаў/функцый, якія павінны быць вызначаны ў кожным модулі трансляцыі, дзе яны выкарыстоўваюцца.

    // example.h
    int g_counter = 0; // Глабальная зменная - парушэнне ODR
    
    void my_function() { // Функцыя - парушэнне ODR
        // некаторы код
    }
    
    inline void my_inline_function() { // inline функцыя - выключэнне
        // некаторы код
    }
    
    template<typename T>
    void process(T value) { // Шаблон функцыі - выключэнне
        // некаторы код
    }
    
  2. Павелічэнне часу кампіліравання. Пры кожным уключэнні загалоўка файла, кампілатар перапрацоўвае яго змесціва нанова. Размяшчэнне кода ў загалоўкавых файлах павялічвае аб'ём працы для кампілтатара, запавольваючы працэс зборкі праекта, асабліва ў вялікіх праектах.

  3. Ускладненне падтрымкі і тэставання. Код, разбросаны па загалоўкавых файлах, становіцца менш модульным. Гэта ўскладняе тэставанне асобных кампанентаў і іх незалежнае змяненне.

  4. Рызыка цыклічнага ўключэння (include loops). Няправільная арганізацыя ўключэнняў з кодам у загалоўкавых файлах можа прывесці да цыклічных залежнасцей і праблем з кампілірацыяй.

У загалоўкавых файлах звычайна аб'яўляюць:

  • Класы (вызначэнні, але не рэалізацыі метадаў)
  • Функцыі (прататыпы)
  • Глабальныя зменныя (з выкарыстаннем extern)
  • Канстанты
  • Шаблоны класаў і функцый (поўныя вызначэнні)
  • inline функцыі (поўныя вызначэнні)
  • Тыпы дадзеных (struct, enum, typedef, using)
  • Пространствы імёнаў (namespace)

Рэалізацыя кода (цела функцый, вызначэнні статычных членаў класа і глабальных зменных) змяшчаецца ў адпаведныя файлы рэалізацыі (.cpp).