Gibt es einen Unterschied zwischen foo(void) und foo() in C++ oder C?

Lesezeit: 4 Minuten

Gibt es einen Unterschied zwischen foovoid und foo in C
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?

  • Für C ist das Q/A hier

    – Antti Haapala – Слава Україні

    7. Mai 2018 um 3:03 Uhr

Gibt es einen Unterschied zwischen foovoid und foo in C
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 voiddann 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

1646977209 948 Gibt es einen Unterschied zwischen foovoid und foo in C
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

Gibt es einen Unterschied zwischen foovoid und foo in C
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


1646977210 214 Gibt es einen Unterschied zwischen foovoid und foo in C
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.

990000cookie-checkGibt es einen Unterschied zwischen foo(void) und foo() in C++ oder C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy