C++ Kurs

using & typedef Anweisung

Die Themen:

using Anweisung

Mit Hilfe der using Anweisung können Synonyme für bestehende Datentypen gebildet werden. Die using Anweisung hat folgende Syntax:

using SYNONYM = DTYP;

Ein solches Synonym kann nach seiner Definition überall im Programm dort eingesetzt werden, wo Angabe eines Datentyps zugelassen ist. Steht die using Anweisung innerhalb eines Blocks, so gilt das definierte Synonym auch nur innerhalb dieses Blocks.

PgmHeader
// Synonym WORD für unsigned short
// und DWORD für unsigned long

using WORD = unsigned short;
using DWORD = unsigned long;

// 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 using Anweisung recht nützlich sein. Da beim Programmentwurf der Datentyp einer Variablen in der Regel nach deren Wertebereich festgelegt wird, können sich beim Portieren einer Applikation (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 diesen Problemen aus dem Weg zu gehen, werden mittels using Anweisungen Synonyme für die einzelnen Datentypen mit den entsprechenden Wertebereichen definiert, z.B. das Synonym INT16 für eine vorzeichenbehaftete 16-Bit Ganzzahl. Wenn jetzt bei den Definitionen der Daten anstelle der Standard-Datentypen dieses Synonym verwendet wird, so belegt eine INT16-Variable, unabhängig von der verwendeten Plattform, immer 16 Bit und besitzt damit auch immer den gleichen Wertebereich.

PgmHeader
16-Bit System (16 Bit gleich int)
using INT16 = int;
using UINT16 = unsigned int;
...

32-Bit System (16 Bit gleich short)
using INT16 = short;
using UINT16 = unsigned short;
...
Definitionen
INT16 nVar1;
UINT16 wVar2;

using und Funktionszeiger

Und auch wenn using nur Schreibarbeit spart (einmal abgesehen von der vorhin erwähnten Portabilität), so gibt es jedoch einen Fall, bei dem der Einsatz von using dringend angeraten ist, nämlich wenn eine Funktion einen Funktionszeiger zurückgibt. Im nachfolgenden Beispiel liefert die Funktion GetFPtr() einen Zeiger auf eine void/void Funktion zurück. Dazu wird ein entsprechendes Synonym für diesen Funktionszeiger definiert, im Beispiel ist dies fp, und dieses Synonym dann als Returntyp der Funktion eingesetzt. Sehen Sie sich auch einmal die Funktionsdeklaration ohne using an. Ich hoffe, Sie sind gut im Zuordnen von Klammerebenen!

PgmHeader
// using für Funktionszeiger
using fp =  void(*)();

// Funktionen deklarieren
void f1();
void f2();

// Funktion die den Funktionszeiger liefert deklarieren
fp GetFPtr();
// Alternative Funktionsdeklaration ohne using
// 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
   fp pFunc;
   // Funktionszeiger holen
   pFunc = GetFPtr();
   // und Funktion über den Zeiger aufrufen
   (*pFunc)();

}
// Funktion definieren, die einen Funktionszeiger zurückliefert
fp GetFPtr()
{
   ...
   return f1;
}

Noch etwas eleganter geht's mit Hilfe des decltype() Operators. Das obige Beispiel würde dann wie folgt aussehen:

PgmHeader
// Funktionen deklarieren
void f1();
void f2();

// Funktion die den Funktionszeiger liefert deklarieren
auto GetFPtr() ->decltype(&f1);

int main()
{
   // Fkt-Zeiger definieren
   decltype(f1) *pFunc;
   // Funktionszeiger holen
   pFunc = GetFPtr();
   // und Funktion über den Zeiger aufrufen
   (*pFunc)();

}
// Funktion definieren, die einen Funktionszeiger zurückliefert
auto GetFPtr() ->decltype(&f1)
{
   ...
   return f1;
}

Zugegeben, dies ist schon ein etwas komplizierter Fall. Aber wenn Sie so etwas einmal benötigen, dann finden Sie das 'Rezept' dafür hier.

typedef Anweisung

Die typedef-Anweisung erfüllt prinzipiell den gleichen Zweck wie die using Anweisung und stammt noch aus der Zeit des vorherigen C++ Standards. Auch sie definiert ein Synonym für einen bereits bestehenden Datentyp und hat folgende Syntax:

typedef DTYP SYNONYM;

Damit können die Anweisung aus dem ersten Beispiel in diesem Kapitel wie folgt umgeschrieben werden:

PgmHeader
// 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 weiteren Verlaufe des Kurses wird nur noch die neuere using Anweisung verwendet.