Auf einer C ++ - Referenzseite finden Sie einige typedef-Beispiele, und ich versuche zu verstehen, was sie bedeuten.
// simple typedef
typedef unsigned long mylong;
// more complicated typedef
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];
Also das einfache typedef (die erste Deklaration) verstehe ich.
Aber was erklären sie mit dem zweiten (unten wiederholt)?
typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];
Was bedeutet (&fp)(int, mylong)
das besonders?
typedef some_type ...
und Sie haben mehrere Zeilen wie diese, Ihre Absichten sind sehr klar und es gibt keinen Platz für Syntaxfehler. Weitaus lesbarer.Antworten:
Es werden mehrere Typedefs gleichzeitig deklariert, genauso wie Sie mehrere Variablen gleichzeitig deklarieren können. Sie sind alle Typen, die auf basieren
int
, aber einige werden in zusammengesetzte Typen geändert.Teilen wir es in separate Erklärungen auf:
typedef int int_t; // simple int typedef int *intp_t; // pointer to int typedef int (&fp)(int, ulong); // reference to function returning int typedef int arr_t[10]; // array of 10 ints
quelle
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];
ist äquivalent zu:
typedef int int_t; typedef int *intp_t; typedef int (&fp)(int, mylong); typedef int arr_t[10];
Es gibt tatsächlich ein ähnliches Beispiel im C ++ 11-Standard:
quelle
Wenn Sie den
cdecl
Befehl haben, können Sie ihn verwenden, um diese Deklarationen zu entmystifizieren.cdecl> explain int (&fp)(int, char) declare fp as reference to function (int, char) returning int cdecl> explain int (*fp)(int, char) declare fp as pointer to function (int, char) returning int
Wenn Sie dies nicht haben
cdecl
, sollten Sie es auf die übliche Weise installieren können (z. B. auf Debian-Systemen mitsudo apt-get install cdecl
).quelle
sudo apt-get install cdecl
Der
(&fp)(int, mylong)
Teil repräsentiert einen Verweis auf eine Funktion. Es wird nicht empfohlen, dass Programmierer Funktionen verwenden, genautypedef
aus dem Grund, aus dem Sie diese Frage stellen. Es verwirrt andere Leute, die sich den Code ansehen.Ich vermute, sie verwenden das
typedef
in so etwas:typedef unsigned long mylong; //for completeness typedef int (&fp)(int, mylong); int example(int param1, mylong param2); int main() { fp fp_function = example; int x = fp_function(0, 1); return 0; } int example(int param1, mylong param2) { // does stuff here and returns reference int x = param1; return x; }
Bearbeitet in Übereinstimmung mit Brians Kommentar:
int(&name)(...)
ist eine aufgerufene Funktionsreferenzname
(die Funktion gibt ein int zurück)int &name(...)
ist eine Funktion, die alsname
Rückgabe einer Referenz auf ein int bezeichnet wirdEin Verweis auf eine Funktion, die einen
int
Verweis zurückgibt, würde ungefähr so aussehen:typedef int &(&fp)(int, mylong)
(Dies wird in einem Programm kompiliert, aber das Verhalten ist nicht getestet).quelle
int&(int, mylong)
ist ein anderer Typ alsint(&)(int, mylong)
. Ersteres ist eine Funktion, auf die ein Verweis zurückgegeben wirdint
. Letzteres bezieht sich auf eine zurückkehrende Funktionint
. Verweise auf Funktionen sind unklar und nicht sehr nützlich, existieren jedoch in C ++.typedef definiert einen neuen Typ zur Verwendung in Ihrem Code, z. B. eine Kurzform.
typedef typename _MyBase::value_type value_type; value_type v; //use v
Der Typname hier lässt den Compiler wissen, dass value_type ein Typ und kein Objekt in _MyBase ist.
Das :: ist der Bereich des Typs. Es ist so ähnlich wie "ist in", also ist value_type "in" _MyBase ". oder kann auch als enthalten angesehen werden.
Mögliches Duplikat: C ++ - Bedeutung einer Anweisung, die typedef und typename kombiniert
quelle
typedef
(das Sie erklärt haben) verstehen , aber durch das komplexere (das Sie nicht einmal angesprochen haben) verwirrt waren.