Hlavičkový soubor

Hlavičkový soubor (anglicky header file) je v informatice speciální soubor, který se používá v některých programovacích jazycích (např. C a C++). Umožňuje vyčlenit některé části zdrojového kódu programu do zvláštních souborů, které lze opakovaně používat. Standardní knihovna jazyka C a standardní knihovna jazyka C++ tradičně deklarují své funkce v hlavičkových souborech.

Novější kompilované jazyky (jako Java nebo C#) nepoužívají dopředné deklarace. Místo toho jsou identifikátory automaticky rozpoznány ze zdrojových kódů a čteny přímo ze symbolů dynamických knihoven, což znamená, že hlavičkové soubory nejsou potřeba.

Charakteristika

Hlavičkové soubory běžně obsahují dopředné deklarace tříd, funkcí, proměnných a jiných identifikátorů. Programátor, který potřebuje deklarovat typový identifikátor ve více než jednom zdrojovém souboru, může identifikátor umístit do hlavičkového souboru. Na soubor je pak možné se odkazovat ze zdrojových souborů pomocí direktivy preprocesoru (#include).

Motivace

Nejmodernější programovací jazyky umožňují rozdělit programy do menších částí (jako jsou třídy a metody) a ty rozdělit do více překladových úloh (typicky ve formě zdrojových souborů), které lze poté kompilovat odděleně. Jakmile je potřeba použít metodu na jiném místě, než kde je definována, musí existovat způsob, jak se na ni odkázat. Například funkce definovaná tímto způsobem v jednom zdrojovém souboru:

int secti(int a, int b)
{
 return a + b;
}

může být deklarována (jako prototyp funkce) a následně použita v druhém zdrojovém souboru následovně:

int secti(int, int);

int obvodCtverce(int x)
{
 return secti(secti(x, x), secti(x, x));
}

Nevýhodou tohoto postupu je, že prototyp funkce musí být přítomen ve všech souborech, které funkci používají. Další nevýhodu představuje fakt, že pokud dojde ke změně typu návratové hodnoty nebo argumentů dané funkce, musí být všechny prototypy funkce také upraveny.

Použití hlavičkového souboru

Tento postup lze automatizovat použitím preprocesoru jazyka C, takže při použití prototypu je vždy použit ten nejnovější. Například v následujícím kódu je ve zvláštním souboru deklarována funkce (kompilátor nevyužívá názvy parametrů, ty jsou ale užitečné pro programátora):

#ifndef ADD_H_GUARD
#define ADD_H_GUARD
int secti(int a, int b);
#endif

Tento soubor používá tzv. include guard, aby se zabránilo vícenásobné definici stejné funkce. Následující kód ukazuje, jak se hlavičkové soubory používají:

#include "add.h"

int obvodCtverce(int x)
{
 return secti(secti(x, x), secti(x, x));
}

Vždy když je tento kód zkompilován, dojde k vložení aktuálních prototypů funkcí, které jsou deklarovány v add.h. Tím se zabrání vzniku potenciálních kritických chyb.

Umístění hlavičkových souborů

Aby nebylo nutné ve zdrojovém kódu vždy uvádět celou cestu k hlavičkovému souboru, lze překladači sdělit, že se nacházejí na standardním umístění. V tom případě je nutné uzavřít jméno souboru do znaků menší < a větší > a použít relativní cestu ke standardnímu umístění:

#include <stdio.h>
#include <acl/libacl.h>

Pokud chceme použít vlastní hlavičkové soubory, uzavírá se jméno souboru do uvozovek a relativní cesta se vztahuje k aktuálním adresáři:

#include "version.h"

Unixové systémy

Hlavičkové soubory jsou v unixových systémech umístěny podle standardu FHS v adresáři /usr/include.

V Linuxu a některých dalších systémech mohou být hlavičkové soubory i v /usr/local/include. V případě stejně pojmenovaných hlavičkových souborů v /usr/local/include a /usr/include se použije hlavičkový soubor v /usr/local/include. V adresáři /usr/local/include je zpravidla umístěno jen několik málo hlavičkových souborů, které překrývají jinou verzi téhož hlavičkového souboru ze základní instalace systému umístěné v /usr/include.

Windows

Hlavičkové soubory jsou umístěny v adresáři, kde je nainstalováno Microsoft Windows SDK. Případně mohou být součástí instalace vývojového prostředí (například Microsoft Visual Studio).

Předkompilované hlavičky

Předkompilované hlavičky (anglicky precompiled headers) jsou technika, kterou používají některé překladače jazyků C a C++, aby snížily čas potřebný ke kompilaci, jelikož hlavičkové soubory mohou obsahovat velké množství zdrojového kódu (například hlavičkový soubor windows.h). Výsledkem kompilace hlavičkových souborů jsou většinou soubory s příponou .pch nebo .gch.

Podobnou funkci zastávají prefixové hlavičky, které jsou většinou také předkompilovány a jsou připojeny ke všem zdrojovým souborům bez nutnosti explicitní deklarace.

Jednoduchý příklad

Máme hlavičkový soubor header.hpp psaný v jazyce C++:

 // header.hpp
 ...

A ten je inkludován souborem source.cpp:

 // source.cpp
 #include "header.hpp"
 ...

Při prvním překladu souboru source.cpp jsou vytvořeny a uloženy do souboru header.pch předkompilované hlavičky. Při dalším spuštění kompilátoru již nedochází k novému zkompilování header.hpp, namísto toho je použit přímo header.pch.

Alternativy

Některé novější programovací jazyky (jako Java) používají místo hlavičkových souborů systém jmenných schémat, které překladači dovolují najít zdrojové soubory asociované s implementací rozhraní a tříd. V tomto případě je ovšem omezena svoboda při pojmenovávání souborů. Tyto jazyky uchovávají informace o funkcích v object kódu a dovolují tak linkeru ověřit, že jsou funkce použity korektně.

COBOL a RPG IV používají způsob inkludování souborů nazývaný copybook. Copybook je vložen do zdrojového souboru podobným způsobem jako hlavičkový soubor a navíc umožňuje nahrazení určitého textu uvnitř něho jiným textem. COBOL používá pro připojení klíčové slovo COPY a pro nahrazení klauzuli REPLACING ... BY ....

Reference

V tomto článku byl použit překlad textu z článku Header file na anglické Wikipedii.

Související články

Externí odkazy