2017-07-19 3 views
1

Wenn ich ein typedef für eine bestimmte Art erklären wollte, würde ich für eine Syntax wie diese geht in diesem Beispiel:Funktionszeiger Mit typedef in C

typedef int INT 

Aber wenn ich ein typedef schaffen wollte für eine Funktion, erwartete ich die folgende Syntax, der zu sein:

typedef void (*)(int, char) myfunc; 

Statt die richtige ist:

typedef void (*myfunc)(int, char); 

Warum also der erste nicht korrekt ist?

+0

Werfen Sie einen Blick auf [diese Antwort] (https://stackoverflow.com/a/30345939/4265352). Es erklärt, wie die Deklarationen von C-Variablen und Typen gelesen werden. – axiac

+0

Der Typdef ist unwesentlich. So definieren Sie Variablen des Typs. – StoryTeller

+1

@StoryTeller Dies ist kein exaktes Duplikat, es fragt nach der Deklarationssyntax für Funktionszeiger, nicht über * typedef * -Deklarationen. –

Antwort

6

Eine typedef sieht genauso aus wie eine "normale" Deklaration. Wenn Sie einen Funktionszeiger deklarieren, würde es so aussehen:

void (*myfunc)(int, char); 

Also, die typedef gleich aussieht, mit dem einzigen Unterschied, dass die angegebene Kennung zu einem Objekt des Typs bezieht sich nicht, sondern ein Typ Aliasnamen statt:

typedef void (*myfunc)(int, char); 

wie für die „? warum“ - Nun, da die Sprache, die so gestaltet ist, aber ich denke, wenn Sie verstehen, wie es w Orks, es ist wohl der einfachste Weg, keine andere Syntax für typedef Deklarationen einzuführen. Dieses Design folgt dem Prinzip der geringsten Überraschung, typedef Deklarationen irgendwie anders zu behandeln wäre unnötig kompliziert.

+0

Also, die Regel ist nicht die folgende: Wenn ich einen Typ namens Type I habe, kann ich ein Typedef namens Name mit 'typedef Type Name' erstellen. Aber die Regel ist stattdessen: Wenn eine Deklaration wie diese _declator_name_ Ich kann den Namen in Typedef durch Weiterleitung der delcarator durch das Schlüsselwort 'typedef'. –

+0

@BiteBytes ja. PeterJs Antwort zeigt, wie dies für die Typdefinition eines Array-Typs gilt. –

+2

@BiteBytes: Syntaktisch gesprochen wird 'typedef' als Speicherklassenbezeichner wie' auto' oder 'extern' behandelt, obwohl es eine andere Bedeutung hat. Also ja, die Form von 'typedef 'ist die Form einer regulären Deklaration, nur mit dem vorangestellten' typedef 'Schlüsselwort. –

0

Die grundlegende Art und Weise Funktionszeiger zu schaffen, ist void (*myfunc)(int, char);

So eine neue Art zu schaffen, die ein Funktionszeiger, die void und int zurückgibt, ist erhalten und char als Argument typedef void (*myfunc)(int, char);

, das ist deshalb die erste ist falsch

Es ist nicht erforderlich, (*) vor function pointer hinzuzufügen.

0

Aber wenn ich ein typedef für eine Funktion schaffen wollte, erwartete ich die folgende Syntax, der zu sein:

typedef void (*)(int, char) myfunc;

Sie können natürlich schreiben Sie besitzen Compiler deine eigene Sprache.

Aber C-Syntax ist wie folgt.

Hier ist das ein weiteres Beispiel:

typedef char foo[10];