typedef specifier
-
typedef- erstellt einen Alias, der überall anstelle eines (möglicherweise komplexen) Tmitgliedsnamens verwendet werden kann.
-
Inhalt |
[bearbeiten] Erklärung
Der typedef-Specifier gibt bei Verwendung in einer Deklaration an, dass es sich um eine typedef-Deklaration handelt und nicht um eine Variablen- oder Funktionsdeklaration.
Typischerweise steht der typedef-Specifier am Anfang der Deklaration, es ist jedoch erlaubt, ihn nach den Typspezifizierern oder zwischen zwei Typspezifizierern zu platzieren. Der typedef-Specifier kann nicht mit anderen Specifiern als Typspezifizierern kombiniert werden.
Eine typedef-Deklaration kann ein oder mehrere Bezeichner in derselben Zeile deklarieren (z. B. int und einen Zeiger auf int), sie kann Array- und Funktionstypen, Zeiger und Referenzen, Klassentypen usw. deklarieren. Jeder in dieser Deklaration eingeführte Bezeichner wird zu einem typedef-Namen, der ein Synonym für den Typ des Objekts oder der Funktion ist, zu dem/der er würde, wenn das Schlüsselwort typedef entfernt würde.
Typedef-Namen sind Aliase für bestehende Typen und keine Deklarationen neuer Typen. typedef kann nicht verwendet werden, um die Bedeutung eines bestehenden Typnamens (einschließlich eines typedef-Namens) zu ändern. Ein einmal deklarierter typedef-Name kann nur neu deklariert werden, um erneut auf denselben Typ zu verweisen. Typedef-Namen sind nur in dem Gültigkeitsbereich gültig, in dem sie sichtbar sind: Verschiedene Funktionen oder Klassendeklarationen können gleichnamige Typen mit unterschiedlicher Bedeutung definieren.
Der typedef-Specifier darf nicht in der Deklaration eines Funktionsparameters noch im decl-specifier-seq einer Funktionsdefinition erscheinen.
void f1(typedef int param); // ill-formed typedef int f2() {} // ill-formed
Der typedef-Specifier darf nicht in einer Deklaration erscheinen, die keinen Deklarator enthält.
typedef struct X {}; // ill-formed
[bearbeiten] typedef Name für Linkage-Zwecke
Wenn eine typedef-Deklaration eine unbenannte Klasse oder Aufzählung definiert, ist der erste typedef-Name des Klassentyps oder Aufzählungstyps, der durch die Deklaration deklariert wird, der typedef-Name für Linkage-Zwecke dieses Typs.
Zum Beispiel ist in typedef struct { /* ... */ } S; S ein typedef-Name für Linkage-Zwecke. Die auf diese Weise definierte Klasse oder Aufzählung hat externe Linkage (es sei denn, sie befindet sich in einem unbenannten Namespace).
|
Eine auf diese Weise definierte unbenannte Klasse sollte nur C-kompatible Konstrukte enthalten. Insbesondere muss sie
und alle Member-Klassen müssen diese Anforderungen (rekursiv) erfüllen. |
(seit C++20) |
[bearbeiten] Hinweise
|
Typ-Aliase bieten dieselbe Funktionalität wie typedef-Deklarationen mit einer anderen Syntax und sind auch auf Vorlagennamen anwendbar. |
(seit C++11) |
[bearbeiten] Schlüsselwörter
[bearbeiten] Beispiel
// simple typedef typedef unsigned long ulong; // the following two objects have the same type unsigned long l1; ulong l2; // more complicated typedef typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10]; // the following two objects have the same type int a1[10]; arr_t a2; // beware: the following two objects do not have the same type const intp_t p1 = 0; // int *const p1 = 0 const int *p2; // common C idiom to avoid having to write "struct S" typedef struct { int a; int b; } S, *pS; // the following two objects have the same type pS ps1; S* ps2; // error: storage-class-specifier cannot appear in a typedef declaration // typedef static unsigned int uint; // typedef can be used anywhere in the decl-specifier-seq long unsigned typedef int long ullong; // more conventionally spelled "typedef unsigned long long int ullong;" // std::add_const, like many other metafunctions, use member typedefs template<class T> struct add_const { typedef const T type; }; typedef struct Node { struct listNode* next; // declares a new (incomplete) struct type named listNode } listNode; // error: conflicts with the previously declared struct name // C++20 error: "struct with typedef name for linkage" has member functions typedef struct { void f() {} } C_Incompatible;
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 576 | C++98 | typedef war in der gesamten Funktionsdefinition nicht erlaubt | im Funktionskörper erlaubt |
| CWG 2071 | C++98 | typedef konnte in einer Deklaration erscheinen, die keinen Deklarator enthielt | jetzt nicht mehr erlaubt |
[bearbeiten] Siehe auch
| C-Dokumentation für Typedef-Deklaration
|