Zaglávna datotéka (angleško header file) je v nekaterih programskih jezikih, kot so C, C++ ali Objective-C, posebna večkrat uporabljiva datoteka v kateri so zbrani določeni elementi programske izvorne kode. Zaglavne datoteke običajno vsebujejo vnaprejšnje deklaracije razredov, podprogramov (funkcij), spremenljivk in drugih identifikatorjev. Programerji, ki želijo deklarirati standardizirane identifikatorje v več kot eni izvorni datoteki, jih lahko vnesejo v eno zaglavno datoteko, ta pa se lahko potem vstavi v druge dele programa, kadar se potrebuje njena vsebina. Standardni knjižnici jezikov C in C++ običajno deklarirata svoje standardne funkcije v zaglavnih datotekah. Največkrat imajo zaglavne datoteke končnico .h.

Novejši programski jeziki, kot sta npr. java ali C#, ne uporabljajo vnaprešnjih deklaracij. Identifikatorji se zaznajo samodejno iz izvornih datotek iz simbolov dinamičnih knjižnic, zato ti jeziki ne potrebujejo zaglavnih datotek.

Utemeljitev uredi

V večini sodobni računalniških programskih jezikih lahko programerji razdelijo programe v manjše komponente (npr. razrede in podprograme) in jih razporedijo med več enot prevoda, običajno v obliki dejanskih izvornih datotek, ki jih lahko sistem prevede ločeno. Ko se podprogram potrebuje nekje drugod kot v enoti prevoda, kjer je definiran, mora obstajati nanj sklic. Če je na primer na ta način definirana funkcija v izvorni datoteki:

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

se lahko deklarira (s prototipom funkcije) in se nanjo sklicuje v drugi izvorni datoteki kot:

int add(int, int);
 
int triple(int x)
{
	return add(x, add(x, x)); 
}

Ena slabost takšne metode je, da mora prototip funkcije obstjati v vseh datotekah, ki uporabljajo funkcijo. Druga slabost je, da kadar se spremenijo tip vračanja funkcije ali njeni argumenti, se morajo posodobiti tudi prototipi. Ta proces se lahko avtomatizira s predprocesorjem C. V naslednji kodi je funkcija deklarirana v ločeni datoteki (imen parametrov prevajalnik ne uporablja, vendar so za programerja koristni:

Datoteka »add.h«
#ifndef ADD_H_GUARD
#define ADD_H_GUARD
int add(int a, int b); /* Ali enakovredno zapisano: int add(int , int); - brez imen parametrov */
#endif

V tej datoteki nastopajo konstrukti include guard, da ne pride do nedovoljenih večkratnih definicij funkcije. V naslednji kodi je prikazano kako se rabijo zaglavne datoteke:

#include "add.h"
int triple(int x)
{
	return add(x,add(x,x));
}

Vsakič, ko se koda prevede, bo zadnji prototip funkcije iz add.h vključen v datoteke, ki uporabljajo to funkcijo, pri tem pa ne bo prišlo do morebitnih pogubnih napak.

#define uredi

Zgledi nekaj predprocesorskih ukazov #define v C-jevski zaglavni datoteki:

#define dESC           0x1b
#define dEOS           ('\0')
#define dPRINT(a)      ( printf("%d",a) )
#define dDEG           *M_PI/180.0      /* a = cos (alfa dDEG); */

#define dELEM(a)       ( sizeof(a)/sizeof((a)[0]) )
#define dNITEMS(a)     ( sizeof(a)/sizeof(*(a)) )
#define dABS(a)        ( (a) < 0 ? -(a) : (a) )
#define dCDIV(a,b)     ( ((a) + (b) - 1)) / (b) )
#define dMIN(a,b)      ( (a) < (b) ? (a) : (b) )
#define dMAX(a,b)      ( (a) > (b) ? (a) : (b) )
#define dMAXM(a,b)     ( (a) < (b) ? (b) : (a) )
#define dMIN3(a,b,c)   ( (a < b ? a : b) < c ? (a < b ? a : b) : c )
#define dMAX3(a,b,c)   ( (a > b ? a : b) > c ? (a > b ? a : b) : c )
#define dIN(a,b,c)     ( (a) <= (b) && (b) <= (c) )

#ifndef dLOCAL
 #define dLOCAL extern
#endif

#define dTMPDIR        "/tmp"
#define dROUND(f)      ( (int) ((f) + 0.5) )

#define dRANDOM(a)    ( rand() % (a) )
#define dRANDOMIZE()  ( srand((unsigned) time (NULL)) )

#define dSWAP(tip,a,b) {tip temp=a; a=b; b=temp;}      /* dSWAP(char*,n1,n2) */