Typedef-Deklaration
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 an der grammatikalischen Stelle eines Speicherklassenspezifizierers verwendet, mit der Ausnahme, dass es Speicher oder Linkage nicht beeinflusst.
typedef int int_t; // declares int_t to be an alias for the type int typedef char char_t, *char_p, (*fp)(void); // declares char_t to be an alias for char // char_p to be an alias for char* // fp to be an alias for char(*)(void)
Inhalt |
[bearbeiten] Erklärung
Wenn eine Deklaration typedef als Speicherklassenspezifizierer verwendet, definiert jeder Dekorator darin einen Bezeichner als Alias für den angegebenen Typ. Da nur ein Speicherklassenspezifizierer pro Deklaration zulässig ist, können Typedef-Deklarationen nicht static oder extern sein.
Eine Typedef-Deklaration führt keinen eigenständigen Typ ein, sie etabliert lediglich ein Synonym für einen bestehenden Typ, wodurch Typedef-Namen kompatibel mit den Typen sind, die sie aliasieren. Typedef-Namen teilen sich den Namensraum mit gewöhnlichen Bezeichnern wie Enumeratoren, Variablen und Funktionen.
|
Ein Typedef für ein VLA kann nur im Block-Scope erscheinen. Die Länge des Arrays wird jedes Mal ausgewertet, wenn der Kontrollfluss ü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) |
[bearbeiten] Hinweise
Ein Typedef-Name kann ein unvollständiger Typ sein, der wie gewohnt vervollständigt werden kann.
typedef int A[]; // A is int[] A a = {1, 2}, b = {3,4,5}; // type of a is int[2], type of b is int[3]
Typedef-Deklarationen werden oft verwendet, um Namen aus dem Tag- Namensraum in den gewöhnlichen Namensraum einzufügen.
typedef struct tnode tnode; // tnode in ordinary name space // is an alias to tnode in tag name space struct tnode { int count; tnode *left, *right; // same as struct tnode *left, *right; }; // now tnode is also a complete type tnode s, *sp; // same as struct tnode s, *sp;
Sie können sogar vermeiden, den Tag-Namensraum überhaupt zu verwenden.
typedef struct { double hi, lo; } range; range z, *zp;
Typedef-Namen werden auch häufig verwendet, um die Syntax komplexer Deklarationen zu vereinfachen.
// array of 5 pointers to functions returning pointers to arrays of 3 ints int (*(*callbacks[5])(void))[3]; // same with typedefs typedef int arr_t[3]; // arr_t is array of 3 int typedef arr_t* (*fp)(void); // pointer to function returning arr_t* fp callbacks[5];
Bibliotheken stellen oft systemabhängige oder konfigurationsabhängige Typen als Typedef-Namen zur Verfügung, um Benutzern oder anderen Bibliothekskomponenten eine konsistente Schnittstelle zu bieten.
#if defined(_LP64) typedef int wchar_t; #else typedef long wchar_t; #endif
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 6.7.8 Typdefinitionen (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 6.7.8 Typdefinitionen (p: TBD)
- C11-Standard (ISO/IEC 9899:2011)
- 6.7.8 Typdefinitionen (p: 137-138)
- C99-Standard (ISO/IEC 9899:1999)
- 6.7.7 Typdefinitionen (p: 123-124)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.5.6 Typdefinitionen
[bearbeiten] Schlüsselwörter
[bearbeiten] Siehe auch
| C++ Dokumentation für
typedef Deklaration |