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
[uredi | uredi kodo]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 | uredi kodo]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) */