Header

A Programozás Wiki wikiből

A header file kifejezés elsősorban a C illetve C++ programnyelven történő programozáshoz kötődik.

A programkódot tipikusan egy .c illetve .cpp kiterjesztésű szöveg állományban adjuk át a fordító programnak, hogy létre hozza a futtatható programot. A programkódban megkülönböztethető a változók, függvények deklarációja és definíciója. Egy egyszerű, egyetlen forrásprogramból álló kódban a deklaráció és definíció egybe folyhat, nem fontos az elkülönítésük. Akkor sem fontos élesen elkülöníteni ezeket, ha az adott elem (változó vagy függvény) hatásköre egyetlen forrásállományra korlátozódik.

Ha azonban egy rendszer összetettsége miatt több forrásprogramra kell bontani a programot, akkor az egyes forrásprogramok között szükséges megosztani információt a közösen használt elemekről.

A források között megosztott változók, függvények deklarációja értelem szerűen csak egy forrás állományba kerülhet, miközben az ilyen megosztott elemek definíciója minden egyes olyan forrás állományba szükséges (megismételten bele lehet írni), amelynek használni kell ezeket (a közös változókat írni/olvasni óhajtja, a közös függvényeket meg akarja hívni).


De ez azonnal kellemetlen redundanciat okoz a forrásokban, hiszen ha valamely definíció megváltozik, akkor ezt minden kapcsolódó helyen át kell vezetni.

Ennek a problémának a megoldására vezettek be egy új forrás állomány típust, a header állományt, amelyet a .h ill. .hpp kiterjesztésű szövegállományokban szokásos tárolni.

A forrásszövegből a forrás .c kiterjesztésű állományával azonos nevű, de .h kiterjesztésű állományba szokás átemelni mindazoknak az elemeknek a definícióját, amelyeket meg kívánunk osztani más forrás állományokkal.

Ezzel megoldódik a redundancia problémája, hiszen egy include nevű mechanizmussal minden forrásállományba becsatlakoztatjuk a közös definíciókat, így egységes marad. További előny, hogy mivel a deklarációt is tartalmazó állományba is becsatoljuk include-val a létrehozott header állományt, így a definíció és a deklaráció szinkronban tartását is megköveteli ezzel a fordító program.

C header példakód

Megjegyzések:

- Több forráskód állományra bontjuk a rendszer ha az túl nagy, egyetlen állományban már nehezen karbantartható. De szükséges a megbontás, ha nem egyetlen fejlesztő készíti a programot és minden fejlesztő a saját kódállományaival dolgozik. Ennek az esetnek a továbbfejlesztett állapota, amikor nem is forrás állományban van meg a korábban vagy más által készített programrész, hanem tárgykódban.

- a használt .c/.c++ illetve .h/.hpp kiterjesztések illetve az azonos filenevő, csak más kiterjesztésű megoldás nem kötelező előírás, csak konvenciók amelyeket általában követnek a fejlesztők.

- A szövegben a C++-ra inkább csak utalások történtek, de főként a C nyelv szempontjából került leírásra ez a megoldás, de a C++ esetén értelem szerűen, a lényeget nem megváltoztató módon történik a folyamat. - A header állomány segítségével nem csak a .C források számára osztjuk meg a típus és név információkat, de a már lefordított (tárgykód) számára is ugyan ez a módszer használatos, amikor is a header tartalma ugyanúgy információkat ad a fordító számára, hogy milyen névvel és szignatúrával használhatjuk az elemeket a forrásprogramban, hogy a linker a megfelelő, már korábban lefordított kódban található változót ill. függvényt megtalálja.