Typedef declaration
Die typedef-Deklaration bietet eine Möglichkeit, einen Bezeichner als Typalias zu deklarieren, der verwendet werden kann, um einen möglicherweise komplexen Typnamen zu ersetzen
Das Schlüsselwort typedef wird in einer Deklaration verwendet, in der grammatikalischen Position eines Speicherklassenspezifizierers , mit der Ausnahme, dass es Speicherung oder Verknüpfung nicht beeinflusst:
typedef int int_t; // deklariert int_t als Alias für den Typ int typedef char char_t, *char_p, (*fp)(void); // deklariert char_t als Alias für char // char_p als Alias für char* // fp als Alias für char(*)(void)
Inhaltsverzeichnis |
Erklärung
Wenn eine Deklaration typedef als Speicherklassenspezifizierer verwendet, definiert jeder Deklarator darin einen Bezeichner als Alias für den angegebenen Typ. Da nur ein Speicherklassenspezifizierer in einer Deklaration erlaubt ist, kann eine typedef-Deklaration nicht static oder extern sein.
Die typedef-Deklaration führt keinen eigenständigen Typ ein, sondern erstellt lediglich ein Synonym für einen bestehenden Typ, daher sind typedef-Namen kompatibel mit den Typen, die sie aliasen. Typedef-Namen teilen sich den Namensraum mit gewöhnlichen Bezeichnern wie Enumeratoren, Variablen und Funktionen.
|
Eine Typedef für ein VLA kann nur im Blockbereich erscheinen. Die Länge des Arrays wird jedes Mal ausgewertet, wenn der Ablaufsteuerung über die Typedef-Deklaration läuft, im Gegensatz zur Deklaration des Arrays selbst: void copyt(int n) { typedef int B[n]; // B is a VLA, its size is n, evaluated now n += 1; B a; // size of a is n from before +=1 int b[n]; // a and b are different sizes for (int i = 1; i < n; i++) a[i-1] = b[i]; } |
(seit C99) |
Hinweise
Der Typname kann ein unvollständiger Typ sein, der wie üblich vervollständigt werden kann:
typedef int A[]; // A ist int[] A a = {1, 2}, b = {3,4,5}; // Typ von a ist int[2], Typ von b ist int[3]
typedef-Deklarationen werden oft verwendet, um Namen aus dem Namensraum für Tags in den gewöhnlichen Namensraum zu injizieren:
typedef struct tnode tnode; // tnode im gewöhnlichen Namensraum // ist ein Alias für tnode im Tag-Namensraum struct tnode { int count; tnode *left, *right; // gleich wie struct tnode *left, *right; }; // jetzt ist tnode auch ein vollständiger Typ tnode s, *sp; // gleich wie struct tnode s, *sp;
Sie können sogar die Verwendung des Tag-Namensraums vollständig vermeiden:
typedef struct { double hi, lo; } range; range z, *zp;
Typedef-Namen werden auch häufig verwendet, um die Syntax komplexer Deklarationen zu vereinfachen:
// Array von 5 Zeigern auf Funktionen, die Zeiger auf Arrays von 3 int zurückgeben int (*(*callbacks[5])(void))[3]; // Gleiches mit Typdefinitionen typedef int arr_t[3]; // arr_t ist Array von 3 int typedef arr_t* (*fp)(void); // Zeiger auf Funktion, die arr_t* zurückgibt fp callbacks[5];
Bibliotheken stellen häufig systemabhängige oder konfigurationsabhängige Typen als Typdefinitionen (typedef) bereit, um eine einheitliche Schnittstelle für Benutzer oder andere Bibliothekskomponenten zu bieten:
#if defined(_LP64) typedef int wchar_t; #else typedef long wchar_t; #endif
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 6.7.8 Typdefinitionen (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.7.8 Typdefinitionen (S.: TBD)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.7.8 Typdefinitionen (S: 137-138)
- C99-Standard (ISO/IEC 9899:1999):
-
- 6.7.7 Typdefinitionen (S: 123-124)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 3.5.6 Typdefinitionen
Schlüsselwörter
Siehe auch
|
C++-Dokumentation
für
typedef
Deklaration
|