Was bedeuten die Klammern um eine Funktion name?
In einem meiner Projekt-Quelldateien, fand ich diese C-Funktion definition:
int (foo) (int *bar)
{
return foo (bar);
}
Hinweis: es ist kein Sternchen neben foo
, so dass es nicht einen Funktionszeiger. Oder ist es?
Was ist hier Los mit den rekursiven Aufruf?
Nein, es ist nicht eine Funktion Zeiger - es ist noch eine reguläre Funktion namens foo.
Dies ist die komplette Funktion ?
haben Sie Beweise, dass diese Funktion verwendet wird, in einen nützlichen Zusammenhang?
...sieht aus wie eine dummy-Funktion, die vielleicht nur geschrieben, um zu sehen, ob es kompiliert, in vorhandene Quelle, und sollte entfernt wurde. Ich würde es entfernen (wenn es das ist, was die Funktion wirklich tut), da am besten wird es sein, Endlosschleife (ich bin mir nicht sicher, ob C-compiler darf optimieren, dass der Schwanz Aufruf springen), im schlimmsten Fall stack-überlauf.
Klammern in C-Deklarationen helfen, zu machen die Sprache mehrdeutig. Schnell, was ist
Dies ist die komplette Funktion ?
haben Sie Beweise, dass diese Funktion verwendet wird, in einen nützlichen Zusammenhang?
...sieht aus wie eine dummy-Funktion, die vielleicht nur geschrieben, um zu sehen, ob es kompiliert, in vorhandene Quelle, und sollte entfernt wurde. Ich würde es entfernen (wenn es das ist, was die Funktion wirklich tut), da am besten wird es sein, Endlosschleife (ich bin mir nicht sicher, ob C-compiler darf optimieren, dass der Schwanz Aufruf springen), im schlimmsten Fall stack-überlauf.
Klammern in C-Deklarationen helfen, zu machen die Sprache mehrdeutig. Schnell, was ist
a(b);
? Erklärung der b
als eine variable vom Typ a
? Oder ein Aufruf der Funktion a
mit dem argument b
? Der Unterschied ist, syntaktischen und Sie nicht wissen, welche Möglichkeit, selbst zu analysieren, ohne sich die Erklärung info von a
; D. H. das sind diejenigen, die postfix-Funktion aufrufen, Klammern oder Klammern optional um eine Feststellung.InformationsquelleAutor user1859094 | 2012-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Abwesenheit von einem Präprozessor Dinge,
foo
's Signatur entsprichtDer einzige Kontext, in dem ich gesehen habe, Leute, die Ihr scheinbar unnötige Klammern um die Funktion von Namen ist, wenn es sowohl eine Funktion und eine Funktion wie makro mit dem gleichen Namen, und der Programmierer will, um zu verhindern, dass die makro-expansion.
Diese Praxis mag ein wenig seltsam auf den ersten, aber die C-Bibliothek stellt einen Präzedenzfall dar, durch mit einigen Makros und Funktionen mit identischem Namen.
Eine solche Funktion/makro-pair-Mädchen ist
isdigit()
. Die Bibliothek kann es definieren wie folgt:Ihre Funktion sieht fast identisch zu dem oben, so dass ich vermute, dass dies ist, was Los ist in Ihrem code zu.
Auf den zweiten Blick ist es fast sicher, was Los ist in Ihrem code. Die
foo(bar)
innerhalb der Funktion wird mit dem entsprechenden makro.makro-expansion erfolgt innerhalb von Klammern, Erweiterung der Funktion wie makro findet nur statt, wenn das nächste token ist eine linke Klammer (C99, 6.10.3§10), so
foo (int* bar)
würde ersetzt zu bekommen, aber nicht(foo) (int *bar)
(das nächste token nachfoo
ist)
)Wie würde so eine Funktion aufgerufen werden? Würden Sie es nennen, mit den Klammern? Zum Beispiel, würde das funktionieren:
(isdigit)(5)
?Richtig, das ist genau, wie würden Sie es nennen.
InformationsquelleAutor NPE
Die Klammern ändern nichts an der Erklärung - es ist nur noch die Definition einer gewöhnlichen Funktion, die aufgerufen wird
foo
.Dem Grund, dass Sie verwendet wurden, ist fast sicher, weil es eine Funktion gibt-wie makro namens
foo
definiert:Mit
(foo)
in der Deklaration der Funktion wird verhindert, dass dieses makro wird erweitert hier. Also, was ist wahrscheinlich geschehen ist, dass eine Funktionfoo()
wird definiert mit seinem Körper ausgeweitet wird, aus der Funktion-wie makrofoo
.mit Klammern um den Namen der Funktion, ist der einzige Weg, um zu verhindern, dass ein makro Erweiterung für eine Funktion-wie makro. Manchmal ist es ein notwendiges Werkzeug.
es gibt auch die Möglichkeit, ohne ein makro und Funktion mit dem gleichen Namen. Ich weiß, Sie können nicht immer alles kontrollieren, aber wenn Sie erreicht diese Lösung, ich würde sagen, etwas ist sehr falsch.
InformationsquelleAutor caf
Sind die Klammern bedeutungslos.
Der code, den Sie zeigen, ist nichts anderes als eine Endlosschleife.
Wenn Sie eine Funktion definieren-pointer, Sie sehen manchmal seltsam Klammern, die etwas bedeuten. Aber dies ist nicht der Fall hier.
Meine Antwort ist in etwa der code angezeigt, und ist richtig für Sie. In fast jedem C Frage hier, vorausgesetzt unbekannt Präprozessor-Definitionen können alles ändern. In diesem Fall, Antworten, die denken, dass der Präprozessor sind in der Tat besser, aber es macht nicht mir falsch.
manchmal stackoverflow bekommt es falsch
InformationsquelleAutor ugoren