Namensräume
Varianten
Aktionen

typedef specifier

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 
  • typedef - erstellt einen Alias, der überall anstelle eines (möglicherweise komplexen) Tmitgliedsnamens verwendet werden kann.

Inhalt

[bearbeiten] Erklärung

Der typedef-Specifier gibt bei Verwendung in einer Deklaration an, dass es sich um eine typedef-Deklaration handelt und nicht um eine Variablen- oder Funktionsdeklaration.

Typischerweise steht der typedef-Specifier am Anfang der Deklaration, es ist jedoch erlaubt, ihn nach den Typspezifizierern oder zwischen zwei Typspezifizierern zu platzieren. Der typedef-Specifier kann nicht mit anderen Specifiern als Typspezifizierern kombiniert werden.

Eine typedef-Deklaration kann ein oder mehrere Bezeichner in derselben Zeile deklarieren (z. B. int und einen Zeiger auf int), sie kann Array- und Funktionstypen, Zeiger und Referenzen, Klassentypen usw. deklarieren. Jeder in dieser Deklaration eingeführte Bezeichner wird zu einem typedef-Namen, der ein Synonym für den Typ des Objekts oder der Funktion ist, zu dem/der er würde, wenn das Schlüsselwort typedef entfernt würde.

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. Ein einmal deklarierter typedef-Name kann nur neu deklariert werden, um erneut auf denselben Typ zu verweisen. Typedef-Namen sind nur in dem Gültigkeitsbereich gültig, in dem sie sichtbar sind: Verschiedene Funktionen oder Klassendeklarationen können gleichnamige Typen mit unterschiedlicher Bedeutung definieren.

Der typedef-Specifier darf nicht in der Deklaration eines Funktionsparameters noch im decl-specifier-seq einer Funktionsdefinition erscheinen.

void f1(typedef int param); // ill-formed
typedef int f2() {}         // ill-formed

Der typedef-Specifier darf nicht in einer Deklaration erscheinen, die keinen Deklarator enthält.

typedef struct X {}; // ill-formed

[bearbeiten] typedef Name für Linkage-Zwecke

Wenn eine typedef-Deklaration eine unbenannte Klasse oder Aufzählung definiert, ist der erste typedef-Name des Klassentyps oder Aufzählungstyps, der durch die Deklaration deklariert wird, der typedef-Name für Linkage-Zwecke dieses Typs.

Zum Beispiel ist in typedef struct { /* ... */ } S; S ein typedef-Name für Linkage-Zwecke. Die auf diese Weise definierte Klasse oder Aufzählung hat externe Linkage (es sei denn, sie befindet sich in einem unbenannten Namespace).

Eine auf diese Weise definierte unbenannte Klasse sollte nur C-kompatible Konstrukte enthalten. Insbesondere muss sie

und alle Member-Klassen müssen diese Anforderungen (rekursiv) erfüllen.

(seit C++20)

[bearbeiten] Hinweise

Typ-Aliase bieten dieselbe Funktionalität wie typedef-Deklarationen mit einer anderen Syntax und sind auch auf Vorlagennamen anwendbar.

(seit C++11)

[bearbeiten] Schlüsselwörter

typedef

[bearbeiten] Beispiel

// simple typedef
typedef unsigned long ulong;
 
// the following two objects have the same type
unsigned long l1;
ulong l2;
 
// more complicated typedef
typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];
 
// the following two objects have the same type
int a1[10];
arr_t a2;
 
// beware: the following two objects do not have the same type
const intp_t p1 = 0; // int *const p1 = 0
const int *p2;
 
// common C idiom to avoid having to write "struct S"
typedef struct { int a; int b; } S, *pS;
 
// the following two objects have the same type
pS ps1;
S* ps2;
 
// error: storage-class-specifier cannot appear in a typedef declaration
// typedef static unsigned int uint;
 
// typedef can be used anywhere in the decl-specifier-seq
long unsigned typedef int long ullong;
// more conventionally spelled "typedef unsigned long long int ullong;"
 
// std::add_const, like many other metafunctions, use member typedefs
template<class T>
struct add_const
{
    typedef const T type;
};
 
typedef struct Node
{
    struct listNode* next; // declares a new (incomplete) struct type named listNode
} listNode; // error: conflicts with the previously declared struct name
 
// C++20 error: "struct with typedef name for linkage" has member functions
typedef struct { void f() {} } C_Incompatible;

[bearbeiten] 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 Funktionskörper erlaubt
CWG 2071 C++98 typedef konnte in einer Deklaration erscheinen, die keinen Deklarator enthielt jetzt nicht mehr erlaubt

[bearbeiten] Siehe auch

C-Dokumentation für Typedef-Deklaration