Namespaces
Variants

Typedef declaration

From cppreference.net

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

typedef

Siehe auch

C++-Dokumentation für typedef Deklaration