Namespaces
Variants

typedef specifier

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
  • typedef - erstellt einen Alias, der überall anstelle eines (möglicherweise komplexen) Typnamens verwendet werden kann.

Inhaltsverzeichnis

Erklärung

Das typedef -Spezifizierer, wenn in einer Deklaration verwendet, spezifiziert, dass die Deklaration eine typedef-Deklaration ist und nicht eine Variablen- oder Funktionsdeklaration.

Typischerweise erscheint der typedef -Spezifizierer am Anfang der Deklaration, obwohl es erlaubt ist, dass er nach den Typspezifizierern oder zwischen zwei Typspezifizierern erscheint. Der typedef -Spezifizierer kann nicht mit anderen Spezifizierern außer Typspezifizierern kombiniert werden.

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

Die 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. Einmal deklariert, darf ein typedef-Name nur erneut deklariert werden, um auf denselben Typ zu verweisen. Typedef-Namen sind nur in dem Gültigkeitsbereich wirksam, in dem sie sichtbar sind: verschiedene Funktionen oder Klassendeklarationen können gleichnamige Typen mit unterschiedlicher Bedeutung definieren.

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

void f1(typedef int param); // ungültig
typedef int f2() {}         // ungültig

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

typedef struct X {}; // fehlerhaft

typedef-Name für Verknüpfungszwecke

Falls eine typedef-Deklaration eine unbenannte Klasse oder Enumeration definiert, ist der erste typedef-Name des durch die Deklaration eingeführten Klassentyps oder Enumerationstyps der typedef-Name für Verbindungszwecke dieses Typs.

Beispielsweise ist in typedef struct { /* ... */ } S ; , S ein Typedef-Name für Verknüpfungszwecke. Der auf diese Weise definierte Klassen- oder Aufzählungstyp besitzt externe Verknüpfung (sofern er sich nicht in einem unbenannten Namespace befindet).

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

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

(since C++20)

Hinweise

Type Aliases bieten die gleiche Funktionalität wie typedef-Deklarationen unter Verwendung einer anderen Syntax und sind auch auf Template-Namen anwendbar.

(seit C++11)

Schlüsselwörter

typedef

Beispiel

// einfache Typdefinition
typedef unsigned long ulong;
// die folgenden zwei Objekte haben denselben Typ
unsigned long l1;
ulong l2;
// komplexere Typdefinition
typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];
// die folgenden zwei Objekte haben denselben Typ
int a1[10];
arr_t a2;
// Achtung: die folgenden zwei Objekte haben nicht denselben Typ
const intp_t p1 = 0; // int *const p1 = 0
const int *p2;
// gängiges C-Idiom, um "struct S" vermeiden zu müssen
typedef struct { int a; int b; } S, *pS;
// die folgenden zwei Objekte haben denselben Typ
pS ps1;
S* ps2;
// Fehler: Speicherklassenspezifizierer darf nicht in einer Typdefinition erscheinen
// typedef static unsigned int uint;
// typedef kann überall in der Deklarationsspezifizierer-Sequenz verwendet werden
long unsigned typedef int long ullong;
// konventioneller geschrieben als "typedef unsigned long long int ullong;"
// std::add_const, wie viele andere Metafunktionen, verwendet Member-Typdefinitionen
template<class T>
struct add_const
{
    typedef const T type;
};
typedef struct Node
{
    struct listNode* next; // deklariert einen neuen (unvollständigen) Strukturtyp namens listNode
} listNode; // Fehler: Konflikt mit der zuvor deklarierten Strukturnamen
// C++20 Fehler: "Struktur mit Typdef-Namen für Verknüpfung" hat Memberfunktionen
typedef struct { void f() {} } C_Incompatible;

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 Funktionsrumpf erlaubt
CWG 2071 C++98 typedef konnte in einer Deklaration erscheinen, die keinen Deklarator enthielt jetzt nicht erlaubt

Siehe auch

C-Dokumentation für Typedef-Deklaration