Wie interpretiere ich diese Deklaration, die scheinbar eine Funktionsdeklaration ist, aber nicht in die übliche Form passt?

8

Ich versuche diese Deklaration von sqlite3.c

zu entschlüsseln %Vor%

Es scheint so, als ob es eine Funktion deklariert, weil es anschließend dieses

gibt %Vor%

und dann scheinbar Aufrufe der Funktion

%Vor%

und

%Vor%

Aber ich kann die Erklärung nicht verstehen. Ich habe hervorgehoben, was ich nicht verstehen kann

%Vor%

Ich frage mich, warum die Erklärung nicht so ist

%Vor%

Ich erwarte, dass es vielleicht eine ähnliche Frage gibt, die bereits gestellt wurde, aber die Suche nach Begriffen wie ( , ) und void bringt wirklich nichts. Also, wenn das ein Betrogener ist, würde ich mich sehr freuen, dass es als solches geschlossen ist.

    
David Heffernan 15.08.2017, 21:02
quelle

2 Antworten

7

Dies deklariert eine Funktion, die einen Funktionszeiger zurückgibt. Der Rückgabetyp ist void (*)(void) ( SQLITE_PRIVATE wird auf static erweitert und ist nicht Teil des Rückgabetyps pro Kommentar), aber der Funktionsname (und die Parameter) müssen innerhalb des (*) -Teils erscheinen.

Funktionen und Arrays sind die zwei C-Typ-Kategorien, die eine Gymnastik zum Parsen erfordern. Sie können sich Array-Typen und Funktionstypen vorstellen, die den von ihnen beschriebenen Bezeichner "dekorieren". Wenn Sie int foo schreiben, sagen Sie, dass das Symbol "foo" einen Integer-Typ hat. Wenn Sie int foo(double) schreiben, sagen Sie, dass das Symbol% ​​co_de% einen ganzzahligen Typ hat. foo(double) und foo müssen zusammenhalten, also muss jede weitere Dekoration das Ganze so einpacken, als wäre es ein einzelner Name.

Der Punkt wird am besten durch das Mischen von Array-Typen und Funktionstypen veranschaulicht, obwohl der Endtyp in C nicht zulässig ist. (Das sagt viel darüber aus, wie lächerlich die Syntax ist.) Zum Beispiel:

%Vor%

wäre ein Array ( (double) ) von Funktionen ( foo[5] ). Auf der anderen Seite:

%Vor%

ist eine Funktion ( int ... (double) ) und gibt ein Array ( foo(double) ) zurück.

Die externe Ressource cdecl.org kann Ihnen helfen, diese Art von Deklaration zu verstehen. Sie müssen jedoch die Strukturnamen durch Standardtypen ersetzen (oder Strukturtypen als int ... [5] anstatt nur als struct sqlite_vfs schreiben), damit Ihre Deklaration verstanden wird.

    
zneak 15.08.2017, 21:03
quelle
2

Diese Deklaration

%Vor%

ist eine Deklaration einer Funktion mit dem Rückgabetyp, der ein Funktionszeiger vom Typ

ist %Vor%

Die Deklaration kann durch die Einführung von typedef vereinfacht werden. Zum Beispiel

%Vor%

Hier ist ein Demonstrationsprogramm, das eine ähnliche Funktion verwendet, die einen Zeiger auf eine andere Funktion zurückgibt.

%Vor%

Seine Ausgabe ist

%Vor%

Zuerst wird die Funktion f mit typedef und dann ohne typedef

deklariert %Vor%     
Vlad from Moscow 15.08.2017 21:32
quelle