Ինչու չենք գրում կոդը գլխագրի ֆայլում?
sobes.tech AI
Պատասխան AI-ից
Код у загалоўкавых файлаў (.h або .hpp у C++) не размяшчаюць па наступных прычынах:
-
Парушэнне прынцыпу аднаго вызначэння (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) { // Шаблон функцыі - выключэнне // некаторы код } -
Павелічэнне часу кампіліравання. Пры кожным уключэнні загалоўка файла, кампілатар перапрацоўвае яго змесціва нанова. Размяшчэнне кода ў загалоўкавых файлах павялічвае аб'ём працы для кампілтатара, запавольваючы працэс зборкі праекта, асабліва ў вялікіх праектах.
-
Ускладненне падтрымкі і тэставання. Код, разбросаны па загалоўкавых файлах, становіцца менш модульным. Гэта ўскладняе тэставанне асобных кампанентаў і іх незалежнае змяненне.
-
Рызыка цыклічнага ўключэння (include loops). Няправільная арганізацыя ўключэнняў з кодам у загалоўкавых файлах можа прывесці да цыклічных залежнасцей і праблем з кампілірацыяй.
У загалоўкавых файлах звычайна аб'яўляюць:
- Класы (вызначэнні, але не рэалізацыі метадаў)
- Функцыі (прататыпы)
- Глабальныя зменныя (з выкарыстаннем
extern) - Канстанты
- Шаблоны класаў і функцый (поўныя вызначэнні)
inlineфункцыі (поўныя вызначэнні)- Тыпы дадзеных (
struct,enum,typedef,using) - Пространствы імёнаў (
namespace)
Рэалізацыя кода (цела функцый, вызначэнні статычных членаў класа і глабальных зменных) змяшчаецца ў адпаведныя файлы рэалізацыі (.cpp).