Frage Was bedeutet diese typedef-Anweisung?


In einer C ++ - Referenzseite stellen sie einige Typedef-Beispiele bereit 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 die 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];

Vor allem was (&fp)(int, mylong) bedeuten?


76
2018-02-27 07:23


Ursprung


Antworten:


Es deklariert mehrere typedefs auf einmal, genauso wie Sie mehrere Variablen gleichzeitig deklarieren können. Sie basieren alle auf Typen int, aber einige sind zu zusammengesetzten Typen modifiziert.

Lassen Sie es in separate Deklarationen brechen:

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

97
2018-02-27 07:30



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:

C ++ 11 7.1.3 Das typedef Spezifizierer

EIN typedef-name führt keinen neuen Typ ein wie a class Erklärung (9.1) oder enum Erklärung does.Beispiel: nach

typedef int MILES , * KLICKSP ;

die Konstruktionen

MILES distance ;
extern KLICKSP metricp ;

sind alle korrekten Deklarationen; die Art der Entfernung ist int die von metricp ist "Zeiger auf int. "-Ende Beispiel


41
2018-02-27 07:26



Wenn du das hast cdecl Mit diesem Befehl können Sie diese Deklarationen 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 nicht haben cdecl, sollten Sie in der Lage sein, es in der üblichen Weise zu installieren (z. B. auf Debian-Typ-Systemen, mit sudo apt-get install cdecl).


32
2018-02-27 07:32



Das (&fp)(int, mylong) Teil repräsentiert eine Referenz auf eine Funktion. Es wird nicht empfohlen, dass Programmierer Funktionen in verwenden typedef genau aus diesem Grund fragen Sie diese Frage. Es verwirrt andere, die den Code betrachten.

Ich schätze, sie benutzen das typedef in etwa so:

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 ein Funktionsreferenz namens name (Die Funktion gibt einen int zurück)

int &name(...) ist eine Funktion namens name  Rückgabe eines Verweises auf einen int

Ein Verweis auf eine Funktion, die ein zurückgibt int Referenz würde etwa so aussehen: typedef int &(&fp)(int, mylong) (Dies kompiliert in einem Programm, aber das Verhalten ist nicht getestet).


0
2018-02-27 07:37



typedef definiert einen neuen Typ für die Verwendung in Ihrem Code, beispielsweise eine Kurzschrift.

typedef typename _MyBase::value_type value_type;
value_type v;
//use v

typename gibt dem Compiler bekannt, dass value_type ein Typ und kein Objekt innerhalb von _MyBase ist.

Der :: ist der Umfang des Typs. Es ist ein bisschen wie "ist in" so Wert_Typ "ist in" _MyBase. oder kann auch als enthalten betrachtet werden.

Mögliches Duplikat: C ++ - Bedeutung einer Anweisung, die typedef und typename kombiniert


-7
2018-02-27 07:34