Mithilfe der typedef Anweisung können Synonyme (andere Namen/Bezeichner) für bestehende Datentypen gebildet werden. Die typedef Anweisung hat folgende Syntax:
| typedef DTYP Synonym; |
Ein solches Synonym kann nach seiner Definition überall im Programm dort eingesetzt werden, wo Angabe eines Datentyps zugelassen ist. Steht die typedef Anweisung innerhalb eines Blocks, so gilt das definierte Synonym auch nur innerhalb dieses Blocks.
|
// Synonym WORD für unsigned short // und DWORD für unsigned long typedef unsigned short WORD; typedef unsigned long DWORD; // unsigned long Variable definieren DWORD ulongVar; // unsigned short Variable definieren WORD ushortVar; |
Im Zusammenhang mit der Portierung von Programmen auf eine andere Plattform kann die typedef Anweisung recht nützlich sein. Da beim Programmentwurf in der Regel der Datentyp einer Variablen nach deren Wertebereich festgelegt wird, können sich beim Portieren einer Anwendung (z.B. von einer 32-Bit Umgebung auf eine 16-Bit Umgebung) Probleme ergeben, wenn die Wertebereiche der Standard-Datentypen auf den Plattformen unterschiedlich sind.
Um diesem Problem aus dem Weg zu gehen, definieren Sie über typedef Anweisungen entsprechende Synonyme für die einzelnen Wertebereiche, z.B. das Synonym INT16 für eine vorzeichenbehaftete 16-Bit Ganzzahl. Wenn Sie jetzt bei den Definitionen der Daten anstelle der Standard-Datentypen dieses Synonym einsetzen, so belegt eine INT16-Variable, unabhängig von der verwendeten Plattform, immer 16 Bit und besitzt damit auch immer den gleichen Wertebereich.
| 16-Bit System (16 Bit
gleich int) typedef int INT16; typedef unsigned int UINT16; ... 32-Bit System (16 Bit gleich short) typedef short INT16; typedef unsigned short UINT16; ... Definitionen INT16 nVar1; UINT16 wVar2; |
Und auch wenn typedefs iIhnen nur Schreibarbeit ersparen (einmal abgesehen von der vorhin erwähnten Portabilität), so gibt es jedoch einen Fall, bei dem der Einsatz von typedef dringend angeraten ist, nämlich wenn eine Funktion einen Funktionszeiger zurückgibt. Im Beispiel liefert die Funktion GetFPtr() einen Zeiger auf eine void/void Funktion zurück. Dazu muss ein entsprechendes Synonym für diesen Funktionszeiger definiert werden. Im Beispiel ist dies fp. Sehen Sie sich auch einmal die Funktionsdeklaration ohne vorherigen typedef an. Ich hoffe, Sie sind gut im zuordnen von Klammerebenen!
|
// typedef für Funktionszeiger typedef void (*fp)(); // Funktionen deklarieren void f1(); void f2(); // Funktion die den Funktionszeiger liefert deklarieren fp GetFPtr(); // Alternative Funktionsdeklaration ohne typedef // void ist hier der Returntyp der Funktion, die über den Funktionszeiger // aufgerufen werden soll. Und die letzte leere Klammer definiert die // Parameter dieser Funktion. // void (*(GetFPtr()))(); int main() { // Fkt-Zeiger definieren void (*pFunc)(); // Funktionszeiger holen pFunc = GetFPtr(); // und Funktion über den Zeiger aufrufen (*pFunc)(); } // Funktion definieren, die einen Funktionszeiger zurückliefert fp GetFPtr() { ... return f1; } |
Zugegeben, dies ist schon ein sehr komplizierter Fall. Aber wenn Sie später so etwas einmal benötigen, dann wissen Sie ja jetzt, wo Sie das 'Rezept' hierfür finden.