Zaglavna datoteka
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
urediV 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
urediZgledi 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) */