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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top