2013-08-27 7 views
8

typedef int (xxx)(int yyy); scheint einen Funktionszeiger namens xxx zu definieren, der auf eine Funktion mit einem ganzzahligen Parameter yyy zeigt.Wie zu verstehen "typedef int (xxx) (int yyy);"?

Aber ich kann diese Syntax nicht verstehen ... Könnte jemand eine gute Erklärung geben?


Ich finde typedef int xxx(int yyy); funktioniert immer noch. Irgendein Unterschied zwischen ihnen?

+1

Sie können [diese Erklärung] (http://c-faq.com/decl/spiral.anderson.html) hilfreich finden. – icktoofay

+0

Sie vermissen ein '*', 'typedef int (* xxx) (int yyy);' definiert einen Funktionszeiger –

+0

@AlterMann Nein, es ist nicht mein Code. Ich denke, es definiert einen Funktionszeiger, aber scheint nicht, ich habe keine Ahnung. – Sayakiss

Antwort

15

Dies definiert einen Funktionstyp, keinen Funktionszeigertyp.

Das Muster mit typedef ist, dass es irgendeine Erklärung so modifiziert, dass anstelle eines Objekts zu erklären, ist es ein Alias ​​für den Typ deklariert das Objekt haben.

Das ist vollkommen gültig:

typedef int (xxx)(int yyy); // Note, yyy is just an unused identifier. 
// The parens around xxx are also optional and unused. 

xxx func; // Declare a function 

int func(int arg) { // Define the function 
    return arg; 
} 

Die C- und C++ Sprachen speziell und barmherzig, die Verwendung eines typedef Namen wie die ganze Art in einer Funktionsdefinition nicht zulassen.

+1

Tolle Erklärung! Es wäre hilfreich, zu zeigen, wie diese Funktion aufgerufen wird, z. B. ob es möglich ist, den Namen "typedef" im Funktionsaufruf zu verwenden. – verbose

+3

@verbose Die Funktion wird wie jede andere aufgerufen. Das Vorhandensein des Namens "typedef" wirkt sich nicht auf irgendetwas aus. Nicht sicher, wie es auf einen Anruf angewendet werden könnte. – Potatoswatter

+0

Sie können diesen Funktionstyp verwenden, um einen Funktionszeiger zu definieren, wie im Beispiel gezeigt, um die Lesbarkeit zu verbessern. –

0

Ja, typedef int (xxx)(int yyy); ist die gleiche wie typedef int xxx(int yyy); die einen Funktionstyp definiert. Ein Beispiel finden Sie ab Seite 156 C 11 Standardentwurf N1570. Zitat von dieser Seite,

All three of the following declarations of the signal function specify exactly the same type, the first without making use of any typedef names.

typedef void fv(int), (*pfv)(int); 
    void (*signal(int, void (*)(int)))(int); 
    fv *signal(int, fv *); 
    pfv signal(int, pfv); 
0

Wenn Sie einige declarator x in Erklärung T x haben, dann T x(t1 p1, t2 p2) bedeutet Funktion mit params p1, p2, die gleiche Art Rückkehr wie die declarator x vor aufweist, wurde .

Parenthesis um den declarator bedeuten Modifikatoren in der Klammer ersten Anwendung.

In Ihrem Fall gibt es keine Modifizierer innerhalb der Klammern. Dies bedeutet, dass sie nicht benötigt werden.

Funktionsprototyp bedeutet Es gibt eine Funktion irgendwo, die diese Signatur hat und ihr Name ist Blah.

Typedef mit dem Prototyp der Funktion bedeutet Geben Sie einen Namen Blah zu einer Funktion Signatur. Dies bedeutet nicht, dass irgendeine Funktion mit dieser Signatur existiert. Dieser Name kann als Typ verwendet werden. Zum Beispiel:

typedef int xxx(int yyy); 

xxx *func_ptr;  // Declaration of a variable that is a pointer to a function. 
xxx *func2(int p1); // Function that returns a pointer to a function. 
+0

'T x' wäre die Deklaration und' x' wäre der Deklarator. – Potatoswatter

+0

Richtig, ich dachte das, aber mein Schreiben war nicht gut. Ich werde aktualisieren. –

Verwandte Themen