Gibt es einen Unterschied zwischen foo(void) und foo() in C++ oder C?
Frage
Betrachten Sie diese beiden Funktionsdefinitionen:
void foo() { }
void foo(void) { }
Gibt es einen Unterschied zwischen diesen beiden?Wenn nicht, warum ist das so? void
Argument da?Ästhetische Gründe?
Lösung
In C:
void foo()
bedeutet „eine Funktion“.foo
eine unbestimmte Anzahl von Argumenten unbestimmten Typs annehmen“void foo(void)
bedeutet „eine Funktion“.foo
keine Argumente akzeptieren“
In C++:
void foo()
bedeutet „eine Funktion“.foo
keine Argumente akzeptieren“void foo(void)
bedeutet „eine Funktion“.foo
keine Argumente akzeptieren“
Durch Schreiben foo(void)
, Daher erreichen wir die gleiche Interpretation in beiden Sprachen und machen unsere Header mehrsprachig (obwohl wir normalerweise noch einige weitere Dinge an den Headern tun müssen, um sie wirklich sprachübergreifend zu machen;nämlich, wickeln Sie sie in eine extern "C"
wenn wir C++ kompilieren).
Andere Tipps
Mir ist klar, dass sich Ihre Frage auf C++ bezieht, aber wenn es um C geht, finden Sie die Antwort in K&R, Seiten 72-73:
Wenn eine Funktionserklärung keine Argumente enthält, wie in
double atof();
Auch das bedeutet, dass über die Argumente von ATOF nichts zu übernehmen ist;Sämtliche Parameterprüfungen sind ausgeschaltet.Diese besondere Bedeutung der leeren Argument -Liste soll älteren C -Programmen mit neuen Compilern ermöglichen.Aber es ist eine schlechte Idee, es mit neuen Programmen zu verwenden.Wenn die Funktion Argumente akzeptiert, deklarieren Sie diese.Wenn es keine Argumente erfordert, verwenden Sie Leere.
C++11 N3337-Standardentwurf
Es gibt keinen Unterschied.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Anhang C „Kompatibilität“ C.1.7 Abschnitt 8:Anmelder sagt:
8.3.5 Änderung:In C++ akzeptiert eine mit einer leeren Parameterliste deklarierte Funktion keine Argumente.In C bedeutet eine leere Parameterliste, dass die Anzahl und der Typ der Funktionsargumente unbekannt sind.
Beispiel:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Begründung:Dies soll fehlerhafte Funktionsaufrufe vermeiden (dh Funktionsaufrufe mit der falschen Nummer oder der Art von Argumenten).
Auswirkung auf Originalfunktion:Wechsel zur Semantik wohldefinierter Merkmale.Diese Funktion wurde in C als „veraltet“ markiert.
8.5.3 Funktionen sagt:
4.Die Parameterdekletscheklausel bestimmt die Argumente, die angegeben werden können, und deren Verarbeitung, wenn die Funktion aufgerufen wird....] Wenn die Parameterdeklausende leer ist, nimmt die Funktion keine Argumente.Die Parameterliste (void) entspricht der leeren Parameterliste.
C99
Wie von C++11 erwähnt, int f()
Gibt nichts über die Argumente an und ist veraltet.
Es kann entweder zu funktionierendem Code oder UB führen.
Ich habe den C99-Standard ausführlich interpretiert unter: https://stackoverflow.com/a/36292431/895245
In C verwenden Sie eine Lücke in einer leeren Funktionsreferenz, sodass der Compiler über einen Prototyp verfügt und dieser Prototyp „keine Argumente“ hat.In C++ müssen Sie dem Compiler nicht mitteilen, dass Sie einen Prototyp haben, da Sie den Prototyp nicht weglassen können.