Namensräume
Varianten
Aktionen

Typedef-Deklaration

Von cppreference.com
< c‎ | Sprache

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

typedef

[bearbeiten] Siehe auch

C++ Dokumentation für typedef Deklaration