Ein Freund von mir versuchte mich auf C zu testen (meine stärkste Sprache ist C ++) und er stellte mir drei Fragen, die ich nicht beantworten konnte:
Versuchen Sie, die folgenden Deklarationen zu erklären:
%Vor%Kann jemand diese Funktionsdeklarationen erklären und erklären, welche Konzepte verwendet werden?
Nun, der erste ist ein Zeiger auf eine Funktion. Mit anderen Worten, es deklariert eine Variable "x", die auf eine Funktion des folgenden Typs zeigt:
%Vor%Und könnte wie folgt verwendet werden:
%Vor%Die zweite scheint eine ungültige Syntax zu sein, aber ich könnte falsch liegen. Wenn es vor dem x ein Sternchen hätte (wie int (* x [10]) (int, char *, void *)), wäre es ein Array von Funktionszeigern und würde wie ein normales Array verwendet:
%Vor%Das dritte ist ein Array von Zeigern auf Funktionszeiger, was nicht praktisch erscheint, aber absolut gültig ist. Eine Beispielverwendung könnte sein:
%Vor%Beachten Sie, dass von diesen die ersten beiden relativ häufig sind. Zeiger auf Funktionen werden verwendet, um Callbacks und verschiedene objektorientierte Programmierkonzepte in C zu erreichen. Ein Array von Zeigern auf Funktionen könnte für eine Ereignistabelle verwendet werden, um den entsprechenden Callback zu finden.
Beachten Sie, dass alle diese in der Tat auch C ++ gültig sind. ;)
Bearbeiten: Ich habe die Grausamkeiten von void main () anscheinend begangen.
Edit 2: Wie Chris Lutz unten betont, sollten sie wirklich in typedefs eingepackt werden. Typedefs machen Code mit Zeigern zu Funktionen VIEL klarer.
Sie benötigen das cdecl
Programm, das Ihnen geben wird Sie eine bestimmte, richtige Antwort auf solche Fragen. Es ist machbar und nützlich, solche Anweisungen manuell zu interpretieren. Dennoch ist cdecl äußerst nützlich, um zu überprüfen, ob Sie eine korrekte Antwort haben.
Sie sind Funktionszeiger, wie oben gesagt, aber meiner Meinung nach ziemlich widerlich geschrieben. Die Art, wie ich sie schreiben würde, ist:
%Vor%Siehe Walt Ws ausgezeichnete Antwort für mehr über Funktionszeiger.
Da die Syntax von C wie die von C ++ in dieser Angelegenheit ist, könnte geordi interessant sein für dich. Es ist ein weiteres gutes Werkzeug zum Lehren und Lernen dieser Deklarationen (und andere Dinge in Zusammenhang mit C ++ und manchmal auch C).
%Vor%Wie auf der Seite erklärt, kann es viel mehr tun, einschließlich der Erstellung eines Typs für Sie
%Vor%Wenn Sie prinzipiell wissen, wie man Dinge deklariert, sich aber nur über eine Sache im Unklaren sind, können Sie Klammern verwenden:
%Vor%Wenn Sie sehen möchten, wie das mit einem Bezeichner darin aussieht, können Sie auch den Namenstyp ändern
%Vor%Wenn Sie eine Deklaration erstellen, sich aber nicht sicher sind, ob die Operatoren Vorrang haben, können Ihnen die Vorrangfunktionen von geordi helfen
%Vor%Tags und Links c