Typedef
C admite o facilitate numita typedef pentru a crea nume pentru
noi tipuri de date. De exemplu declaratia:
typedef int LENGTH;
face numele LENGTH sinonim pentru "int". Tipul LENGTH poate
fi utilizat in declaratii exact la fel ca int:
LENGTH len, maxlen;
LENGTH *lengths[];
Similar, declaratia:
typedef char*STRING;
face ca STRING sa fie sinonim cu char* sau pointerul unui
caracter, care poate fi utilizat in declaratii ca:
STRING p, lineptr[LINES], alloc();
Observati ca tipul fiind declarat printr-un typedef apare in
pozitia unui nume de variabila. Sintactic, typedef este ca o
clasa de memorie, extern, static, etc. In cazul de mai sus am
utilizat litere pentru a accentua numele.
Ca de exemplu mai complicat putem folosi typedef pentru
nodurile copacului prezentat mai inainte in acest capitol:
typedef struct tnode TREENODE, *TREEPTR;
Aceasta creeaza doua noi tipuri de cuvinte cheie numite TREENODE
(o structura) si TREEPTR (un pointer la structura), dupa care
rutina "talloc" poate deveni:
TREEPTR talloc()
{
char *alloc();
return((TREEPTR) alloc(sizeofTREENODE)));
Trebuie sa specificam ca un typedef nu creaza noi tipuri; mai
degraba renumeste tipurile existente. Variabilele astfel
declarate au exact aceleasi proprietati ca si variabilele a
caror declaratii sint explicite. In fond, typedef este ca un
#define, exceptind ca, de cind este interpretat de copilator el
face fata cu substitutiile in text care sint dincolo de
capacitatile C macro procesorului. De exemplu:
typedef int (*PFI) ();
creaza tipul PFI, care poate fi utilizat intr-un context ca
PFI strcmpp, numcmp, swap;
din programul de sort din capitolul 5.
Exista doua motive mai importante pentru a utiliza declaratiile
t9pedef. Primul este de a parametrizaun program alaturi de
problemele de portabilitate. Daca pse utilizeza typedef pentru
diferite tipuri de date care pot fi dependente de masina, numai
typedef necesita modificari daca programul este mutat pe alta
masina. O situatie obisnuita este de a folosi typedef pentru
cantitati intregi variate, cind se alcatuieste un set adecvat de
"short", "int" si "long" pentru fiecare masina.
Un al doilea scop a lui typedef este de a da mai mare claritate
unui program numit TREEPTR este mai usor de inteles decit unul
declarat ca un simplu pointer la o structura complicata.
In final, exista deja posibilitatea ca in viitor, compilatorul
sau * un alt program ca "lint" sa faca uz de informatia
continuta in typedef ca sa execute niste controale in plus asupra
programului.