Betrachten Sie diese beiden Funktionsdefinitionen:
void foo() { }
void foo(void) { }
Gibt es einen Unterschied zwischen diesen beiden? Wenn nicht, warum ist die void
Streit da? Ästhetische Gründe?
Landon
Betrachten Sie diese beiden Funktionsdefinitionen:
void foo() { }
void foo(void) { }
Gibt es einen Unterschied zwischen diesen beiden? Wenn nicht, warum ist die void
Streit da? Ästhetische Gründe?
DrPizza
Im C:
void foo()
bedeutet “eine Funktion foo
Nehmen einer unbestimmten Anzahl von Argumenten unbestimmten Typs” void foo(void)
bedeutet “eine Funktion foo
keine Argumente annehmen”Im C++:
void foo()
bedeutet “eine Funktion foo
keine Argumente annehmen” void foo(void)
bedeutet “eine Funktion foo
keine Argumente annehmen”Durch Schreiben foo(void)
daher erreichen wir die gleiche Interpretation in beiden Sprachen und machen unsere Kopfzeilen mehrsprachig (obwohl wir normalerweise einige weitere Dinge an den Kopfzeilen tun müssen, um sie wirklich sprachübergreifend zu machen, nämlich sie in eine extern "C"
wenn wir C++ kompilieren).
Aber wenn C++ die void
dann hätte es das “ärgerlichste Parsing” -Problem vermeiden können.
– Adrian McCarthy
4. Januar 2010 um 17:47 Uhr
Stimmt, aber es gibt so viele andere beschissene Parses in C++, dass es keinen wirklichen Sinn macht, über einen von ihnen zu kvetchen.
– DrPizza
4. Januar 2010 um 18:49 Uhr
Zu einer kürzlich gestellten Frage hat @James Kanze einen interessanten Leckerbissen gepostet. Reposten Sie hier, um es nicht zu verlieren: Die ersten Versionen von C erlaubten es daher nicht, die Anzahl der Parameter anzugeben, die eine Funktion annehmen könnte void foo()
war die einzige Syntax, um eine Funktion zu deklarieren. Als Signaturen eingeführt wurden, musste das C-Komitee den No-Parameter von der alten Syntax eindeutig machen und führte den ein void foo(void)
Syntax. C++ hat es aus Gründen der Kompatibilität genommen.
– Matthias M.
14. September 2011 um 8:14 Uhr
Können Sie mir ein Beispiel für C C90 und höher geben, wo verwendet wird void foo()
anstatt void foo(void)
wird einen funktionellen Unterschied erzeugen? Dh ich benutze die Version ohne Void seit vielen Jahren und habe kein Problem gesehen, übersehe ich etwas?
– chacham15
7. November 2011 um 8:30 Uhr
@chacham15 void foo() { if ( rand() ) foo(5); }
kompiliert und läuft (was undefiniertes Verhalten verursacht, es sei denn, Sie haben sehr viel Glück), während void foo(void)
mit demselben Körper würde einen Kompilierungsfehler verursachen.
– MM
22. Dezember 2015 um 22:35 Uhr
Kyle Cronin
Mir ist klar, dass sich Ihre Frage auf C++ bezieht, aber wenn es um C geht, finden Sie die Antwort in K&RSeiten 72-73:
Wenn eine Funktionsdeklaration keine Argumente enthält, wie in
double atof();
auch das ist so zu verstehen, dass über die Argumente von atof nichts anzunehmen ist; Alle Parameterprüfungen sind ausgeschaltet. Diese besondere Bedeutung der leeren Argumentliste soll es ermöglichen, ältere C-Programme mit neuen Compilern zu kompilieren. Aber es ist eine schlechte Idee, es mit neuen Programmen zu verwenden. Wenn die Funktion Argumente akzeptiert, deklarieren Sie sie; wenn es keine Argumente benötigt, verwenden Sie void.
Aber die Frage bezieht sich auf Definitionen, in diesem Fall ist die relevante C-Regel Eine leere Liste in einem Funktionsdeklarator, der Teil einer Definition dieser Funktion ist, gibt an, dass die Funktion keine Parameter hat.
– Jinawee
26. Dezember 2018 um 12:56 Uhr
Ciro Santilli Путлер Капут 六四事
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: Deklaratoren sagt:
8.3.5 Änderung: In C++ nimmt eine mit einer leeren Parameterliste deklarierte Funktion keine Argumente entgegen. In C bedeutet eine leere Parameterliste, dass Anzahl und Typ der Funktionsargumente unbekannt sind.
Beispiel:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Begründung: Dies dient dazu, fehlerhafte Funktionsaufrufe zu vermeiden (dh Funktionsaufrufe mit der falschen Anzahl oder Art von Argumenten).
Auswirkung auf ursprüngliches Merkmal: Wechsel zur Semantik des wohldefinierten Merkmals. Diese Funktion wurde in C als „veraltet“ markiert.
8.5.3 Funktionen sagt:
4. Die Parameterdeklarationsklausel bestimmt die angebbaren Argumente und deren Verarbeitung beim Aufruf der Funktion. […] Wenn die Parameterdeklarationsklausel leer ist, nimmt die Funktion keine Argumente entgegen. 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
Die Syntaxhervorhebung ist in der Nähe von “means int” ausgeschaltet. Kannst du das Reparieren? Zum Beispiel abgeschaltete Insider-Kommentare oder “ungültig” eher wie hier.
– Peter Mortensen
12. November 2021 um 4:37 Uhr
Paul Tomblin
In C verwenden Sie eine Leerstelle in einer leeren Funktionsreferenz, damit der Compiler einen Prototyp hat und dieser Prototyp “keine Argumente” hat. In C++ müssen Sie dem Compiler nicht mitteilen, dass Sie einen Prototyp haben, weil Sie den Prototyp nicht weglassen können.
Für C ist das Q/A hier
– Antti Haapala – Слава Україні
7. Mai 2018 um 3:03 Uhr