Suche…


Einführung

Die typedef und (seit C ++ 11) using von Schlüsselwörtern verwendet werden kann , um einen neuen Namen einer bestehenden Art zu geben.

Syntax

  • typedef Typspezifizierer-seq- Init-Deklaratorliste ;
  • attributspezifizierer-seq typedef deklarationsbezeichner- seq init-deklaratorliste ; // seit C ++ 11
  • Verwendung Identifikator attribute-Spezifizierer-Seq (opt) = type-ID; // seit C ++ 11

Grundlegende Typedef-Syntax

Eine typedef Deklaration hat dieselbe Syntax wie eine Variablen- oder Funktionsdeklaration, enthält jedoch das Wort typedef . Das Vorhandensein von typedef bewirkt, dass die Deklaration einen Typ anstelle einer Variablen oder Funktion deklariert.

int T;         // T has type int
typedef int T; // T is an alias for int

int A[100];         // A has type "array of 100 ints"
typedef int A[100]; // A is an alias for the type "array of 100 ints"

Nachdem ein Typalias definiert wurde, kann er austauschbar mit dem ursprünglichen Namen des Typs verwendet werden.

typedef int A[100];
// S is a struct containing an array of 100 ints
struct S {
    A data;
};

typedef erstellt niemals einen eigenen Typ. Es gibt nur eine andere Möglichkeit, auf einen vorhandenen Typ zu verweisen.

struct S {
    int f(int);
};
typedef int I;
// ok: defines int S::f(int)
I S::f(I x) { return x; }

Komplexere Anwendungen von Typedef

Die Regel, dass typedef Deklarationen dieselbe Syntax wie gewöhnliche Variablen haben, und Funktionsdeklarationen können zum Lesen und Schreiben komplexer Deklarationen verwendet werden.

void (*f)(int);         // f has type "pointer to function of int returning void"
typedef void (*f)(int); // f is an alias for "pointer to function of int returning void"

Dies ist besonders nützlich für Konstrukte mit einer verwirrenden Syntax, z. B. Zeiger auf nicht statische Member.

void (Foo::*pmf)(int);         // pmf has type "pointer to member function of Foo taking int
                               // and returning void"
typedef void (Foo::*pmf)(int); // pmf is an alias for "pointer to member function of Foo
                               // taking int and returning void"

Die Syntax der folgenden Funktionsdeklarationen ist selbst für erfahrene Programmierer schwer zu merken:

void (Foo::*Foo::f(const char*))(int);
int (&g())[100];

typedef kann verwendet werden, um das Lesen und Schreiben zu erleichtern:

typedef void (Foo::pmf)(int);  // pmf is a pointer to member function type
pmf Foo::f(const char*);       // f is a member function of Foo

typedef int (&ra)[100];        // ra means "reference to array of 100 ints"
ra g();                        // g returns reference to array of 100 ints

Mehrere Typen mit typedef deklarieren

Das Schlüsselwort typedef ist ein typedef , es gilt also für jeden Deklarator. Daher bezieht sich jeder deklarierte Name auf den Typ, den dieser Name ohne typedef .

int *x, (*p)();         // x has type int*, and p has type int(*)()
typedef int *x, (*p)(); // x is an alias for int*, while p is an alias for int(*)()

Alias-Deklaration mit "using"

C ++ 11

Die Syntax der using ist sehr einfach: Der zu definierende Name wird auf der linken Seite und die Definition auf der rechten Seite angezeigt. Sie müssen nicht scannen, um zu sehen, wo der Name ist.

using I = int;
using A = int[100];             // array of 100 ints
using FP = void(*)(int);        // pointer to function of int returning void
using MP = void (Foo::*)(int);  // pointer to member function of Foo of int returning void

Das Erstellen eines typedef mit using hat genau dieselbe Wirkung wie das Erstellen eines typedef mit typedef . Es ist einfach eine alternative Syntax, um dasselbe zu erreichen.

Im Gegensatz zu typedef kann die using als Vorlage erfolgen. Eine „Vorlage typedef“ erstellt mit using wird eine genannt Alias - Vorlage .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow