'typedef' ist ein mächtiges Werkzeug zur Erstellung neuer Namen (Aliases) für Typen, was den Code kürzer und einfacher zu warten und zu verstehen macht. Das Schlüsselwort tauchte in frühen Versionen von C auf und erleichterte Entwicklern großer Projekte das Leben, als lange Deklarationen von Strukturen und Zeigern den Code schwer lesbar und wartbar machten.
Ursprünglich wurden Strukturen und Vereinigungen mit langen Deklarationen unter Verwendung der Schlüsselwörter struct, union, enum definiert. Mit dem Wachstum des Codes wurden solche Deklarationen überflüssig und unpraktisch, was zur Einführung von typedef führte – zur Verkürzung und Standardisierung von Typen.
Typische Fehler hängen mit dem falschen Verständnis von Aliases, der Vermischung von typedef mit der Deklaration von Strukturen, anonymen Strukturen, Schwierigkeiten mit Arrays von Zeigern und nicht dokumentierten Namensübereinkünften zusammen.
'typedef' ermöglicht es, bestehenden Typen – sowohl Basis- als auch zusammengesetzten – kurze Namen zu geben:
Beispielcode:
typedef struct Point { int x, y; } Point; Point p1; // anstelle von 'struct Point p1;' typedef unsigned char byte; byte buffer[8];
Wichtige Merkmale:
1. Kann man mit typedef einen "neuen Typ" erstellen, der inkompatibel mit dem Basistyp ist (z.B. int)?
Nein. typedef gibt nur einen Alias. Der Typ auf Compiler-Ebene bleibt derselbe, eine Umwandlung ist ohne Compilerfehler möglich.
2. Wenn typedef struct {} name_t; deklariert wird und dann struct name_t var; verwendet wird, was ist das Ergebnis?
Das ist ein Fehler! Nach typedef struct MyStruct { ... } Name; wird Name für Variablen verwendet, nicht struct Name. struct Name ist dem Compiler unbekannt – so funktioniert das nicht.
3. typedef int arr[10]; arr a,b; Was ist der Typ von a und b?
a und b sind beide Arrays von int der Länge 10. Das sind keine Zeiger! Ein Fehler wäre die Erwartung 'int* a, b', wenn man die Besonderheiten von typedef mit Arrays und Zeigern vergisst.
Im Projekt wird typedef struct User { ... } User; deklariert, aber es wird struct User my_user; verwendet – der Compiler gibt einen Fehler aus, der Code ist nicht portierbar.
Vorteile:
Nachteile:
Im gesamten Projekt wird ein einheitlicher Standard eingehalten: typedef struct {...} Name;, es wird nur Name var; ohne struct verwendet.
Vorteile:
Nachteile: