12.4    Eigene Typen mit typedef deklarieren

Bei den Strukturen wurde bereits kurz gezeigt, wie Sie aus komplexeren Namen bzw. Typen etwas einfachere und vor allem übersichtliche Synonyme erstellen können. Ein mit typedef erstelltes Synonym können Sie nach wie vor mit dem umständlicheren Namen verwenden. Hierzu ein Beispiel:

typedef unsigned char Byte_t;
Byte_t byte; // gleich wie: unsigned char byte;
Byte_t *bytePtr; // gleich wie: unsigned char *bytePtr;

Mithilfe von typedef haben Sie hier ein Synonym für unsigned char erstellt. Anstatt unsigned char können Sie jetzt beispielsweise auch eine Variable mit dem typedef-Namen Byte_t deklarieren. Im Geltungsbereich der typedef-Deklaration ist Byte_t damit gleichbedeutend mit dem Typ unsigned char. Weitere gängige Beispiele sind:

typedef unsigned char* BytePtr_t;
typedef int Word;

Auch die Standardbibliothek macht regen Gebrauch von typedef, damit sie möglichst portabel bleibt. So könnte in der Header-Datei time.h der Typ time_t wie folgt definiert sein:

typedef int time_t;

Der Standard schreibt hier nicht vor, wie time_t implementiert ist. Bei Systemen, die eine vorzeichenbehaftete 32-Bit-Ganzzahl für time_t verwenden, ist daher am 19. Januar 2038 Schluss, weil dann die maximale Anzahl der abgelaufenen Zeit seit dem 1. Januar 1970 mit 2.147.483.647 Sekunden überschritten und mit –2.147.483.648 Sekunden zum 13. Dezember 1901 wird.

Auf einem anderen System könnte die Deklaration auch folgendermaßen aussehen:

typedef long long time_t;

Wenn hier also time_t mit einem 64-Bit-Ganzzahltyp implementiert ist, wird unser Programm noch die nächsten 292 Milliarden Jahre zuverlässig arbeiten, aber schon weit davor (nämlich in 20 Milliarden Jahren) wird das Universum aufhören zu existieren.

Der Vorteil ist hier offensichtlich: Bei der Verwendung von time_t müssen Sie sich über die Portierung auf andere Systeme keine Gedanken machen. Sie verwenden einfach time_t, und den Rest übernimmt die Standardbibliothek für Sie.

typedef kann auch für komplexere Datentypen wie Arrays verwendet werden. Hier ein Beispiel:

typedef int Wochen[52];
...
// int-Array mit 52 Elementen
Wochen jahr2010;
// Zugriff wie gewöhnlich:
jahr2010[0] = 1234;
jahr2010[1] = 2345;
...
// Es geht noch komplexer:
Wochen jahr2010_Abteilung[4]; // = jahr2010_Abteilung[52][4]
Wochen *jahrPtr; // = (*jahrPtr)[52]

Hier muss hinzugefügt werden, dass mit typedef das Programm nicht etwa besser oder schneller wird. Vielmehr ist es eine Hilfe, komplexe Speicherobjekte mit einem einfacheren Synonym bei der Entwicklung zu verwenden. Auch bei der Portierung auf andere Systeme kann typedef das Leben unter Umständen erheblich vereinfachen, vor allem, weil es Compiler gibt, die die Schlüsselworte struct und enum nur zusammen mit typedef zulassen. Das heißt natürlich auch, dass Ihnen hier vor allem das Erstellen portabler Programme große Einschränkungen auferlegt.