typedef
specifier
-
-
typedef- erstellt einen Alias, der überall anstelle eines (möglicherweise komplexen) Typnamens verwendet werden kann.
-
Inhaltsverzeichnis |
Erklärung
Das typedef -Spezifizierer, wenn in einer Deklaration verwendet, spezifiziert, dass die Deklaration eine typedef-Deklaration ist und nicht eine Variablen- oder Funktionsdeklaration.
Typischerweise erscheint der typedef -Spezifizierer am Anfang der Deklaration, obwohl es erlaubt ist, dass er nach den Typspezifizierern oder zwischen zwei Typspezifizierern erscheint. Der typedef -Spezifizierer kann nicht mit anderen Spezifizierern außer Typspezifizierern kombiniert werden.
Eine typedef-Deklaration kann einen oder mehrere Bezeichner in derselben Zeile deklarieren (z.B. int und einen Zeiger auf int ), sie kann Array- und Funktionstypen, Zeiger und Referenzen, Klassentypen etc. deklarieren. Jeder in dieser Deklaration eingeführte Bezeichner wird zu einem typedef-Namen , welcher ein Synonym für den Typ des Objekts oder der Funktion ist, das/der entstehen würde, wenn das Schlüsselwort typedef entfernt würde.
Die 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. Einmal deklariert, darf ein typedef-Name nur erneut deklariert werden, um auf denselben Typ zu verweisen. Typedef-Namen sind nur in dem Gültigkeitsbereich wirksam, in dem sie sichtbar sind: verschiedene Funktionen oder Klassendeklarationen können gleichnamige Typen mit unterschiedlicher Bedeutung definieren.
Der typedef -Spezifizierer darf nicht in der Deklaration eines Funktionsparameters noch im decl-specifier-seq einer Funktionsdefinition erscheinen:
void f1(typedef int param); // ungültig typedef int f2() {} // ungültig
Der typedef -Spezifizierer darf nicht in einer Deklaration erscheinen, die keinen Deklarator enthält:
typedef struct X {}; // fehlerhaft
typedef-Name für Verknüpfungszwecke
Falls eine typedef-Deklaration eine unbenannte Klasse oder Enumeration definiert, ist der erste typedef-Name des durch die Deklaration eingeführten Klassentyps oder Enumerationstyps der typedef-Name für Verbindungszwecke dieses Typs.
Beispielsweise ist in
typedef
struct
{
/* ... */
}
S
;
,
S
ein Typedef-Name für Verknüpfungszwecke. Der auf diese Weise definierte Klassen- oder Aufzählungstyp besitzt
externe Verknüpfung
(sofern er sich nicht in einem unbenannten Namespace befindet).
|
Eine auf diese Weise definierte unbenannte Klasse sollte nur C-kompatible Konstrukte enthalten. Insbesondere darf sie
und alle Member-Klassen müssen diese Anforderungen ebenfalls (rekursiv) erfüllen. |
(since C++20) |
Hinweise
|
Type Aliases bieten die gleiche Funktionalität wie typedef-Deklarationen unter Verwendung einer anderen Syntax und sind auch auf Template-Namen anwendbar. |
(seit C++11) |
Schlüsselwörter
Beispiel
// einfache Typdefinition typedef unsigned long ulong; // die folgenden zwei Objekte haben denselben Typ unsigned long l1; ulong l2; // komplexere Typdefinition typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10]; // die folgenden zwei Objekte haben denselben Typ int a1[10]; arr_t a2; // Achtung: die folgenden zwei Objekte haben nicht denselben Typ const intp_t p1 = 0; // int *const p1 = 0 const int *p2; // gängiges C-Idiom, um "struct S" vermeiden zu müssen typedef struct { int a; int b; } S, *pS; // die folgenden zwei Objekte haben denselben Typ pS ps1; S* ps2; // Fehler: Speicherklassenspezifizierer darf nicht in einer Typdefinition erscheinen // typedef static unsigned int uint; // typedef kann überall in der Deklarationsspezifizierer-Sequenz verwendet werden long unsigned typedef int long ullong; // konventioneller geschrieben als "typedef unsigned long long int ullong;" // std::add_const, wie viele andere Metafunktionen, verwendet Member-Typdefinitionen template<class T> struct add_const { typedef const T type; }; typedef struct Node { struct listNode* next; // deklariert einen neuen (unvollständigen) Strukturtyp namens listNode } listNode; // Fehler: Konflikt mit der zuvor deklarierten Strukturnamen // C++20 Fehler: "Struktur mit Typdef-Namen für Verknüpfung" hat Memberfunktionen typedef struct { void f() {} } C_Incompatible;
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 Funktionsrumpf erlaubt |
| CWG 2071 | C++98 | typedef konnte in einer Deklaration erscheinen, die keinen Deklarator enthielt | jetzt nicht erlaubt |
Siehe auch
|
C-Dokumentation
für
Typedef-Deklaration
|