'typedef' is een krachtig hulpmiddel voor het creëren van nieuwe namen (aliassen) voor types, waardoor de code korter en gemakkelijker te onderhouden en te begrijpen is. Het sleutelwoord verscheen in de vroege versies van C, en vereenvoudigde het leven van ontwikkelaars van grote projecten, waar lange declaraties van structuren en pointers de code onleesbaar en moeilijk te onderhouden maakten.
Oorspronkelijk werden structuren en unies gedefinieerd met lange declaraties met de sleutelwoorden struct, union, enum. Met de groei van de code zijn dergelijke declaraties overbodig en ongemakkelijk geworden, wat leidde tot de introductie van typedef — voor het verkorten en standaardiseren van types.
Typische fouten zijn gerelateerd aan een verkeerd begrip van aliassen, verwarring tussen typedef en de declaratie van structuren, anonieme structuren, moeilijkheden met arrays van pointers en niet gedocumenteerde naamgevingsconventies.
'typedef' stelt je in staat om korte namen aan bestaande types te geven — zowel basis- als samengestelde types:
Voorbeeld code:
typedef struct Point { int x, y; } Point; Point p1; // in plaats van 'struct Point p1;' typedef unsigned char byte; byte buffer[8];
Belangrijke kenmerken:
1. Is het mogelijk om met typedef een "nieuw type" te maken dat incompatibel is met het basistype (bijvoorbeeld, int)?
Nee. typedef geeft alleen een alias. Het type op compilatieniveau blijft hetzelfde, casten is mogelijk zonder compilatiefouten.
2. Wat gebeurt er als je typedef struct {} name_t; declareert, en daarna struct name_t var;?
Dat is een fout! Na typedef struct MyStruct { ... } Name; wordt Name gebruikt voor variabelen, niet struct Name. struct Name is onbekend voor de compiler — zo werkt het niet.
3. typedef int arr[10]; arr a,b; Wat is het type van a en b?
a en b zijn beide arrays van int van lengte 10. Dit zijn geen pointers! De fout is de verwachting 'int* a, b' als je de kenmerken van typedef met arrays en pointers vergeet.
In een project wordt typedef struct User { ... } User; gedeclareerd, maar wordt struct User my_user; gebruikt — de compiler klaagt, de code is niet overdraagbaar.
Voordelen:
Nadelen:
In het hele project wordt één standaard aangehouden: typedef struct {...} Name; en alleen Name var; zonder struct gebruikt.
Voordelen:
Nadelen: