2008-09-09 20 views

Antwort

263

In C:

  • void foo() bedeutet "eine Funktion foo eine unbestimmte Anzahl von Argumenten nicht näher bezeichneten Art unter"
  • void foo(void) bedeutet "eine Funktion foo nehmen keine Argumente"

In C++:

  • void foo() bedeutet
  • void foo(void) bedeutet „eine Funktion foo ohne Argumente“ „eine Funktion foo ohne Argumente“

Durch das Schreiben foo(void) wir also die gleiche Interpretation über beide Sprachen erreichen und machen Sie unsere Header mehrsprachig (obwohl wir normalerweise einige Dinge mehr an den Headern vornehmen müssen, um sie wirklich sprachübergreifend zu machen; nämlich, wickeln Sie sie in eine extern "C", wenn wir C++ kompilieren.

+4

Aber wenn C++ das "void" benötigt hätte, dann hätte es das "am meisten ärgerliche Parse" -Problem vermeiden können. –

+4

Richtig, aber es gibt so viele andere beschissene Parser in C++, es gibt keinen wirklichen Grund, über irgendeinen von ihnen zu reden. – DrPizza

+9

Auf einer letzten Frage hat @James Kanze einen interessanten Leckerbissen gepostet. Repost hier, um es zu vermeiden: die ersten Versionen von C erlaubten nicht, die Anzahl der Parameter anzugeben, die eine Funktion annehmen könnte, daher war 'void foo()' die einzige Syntax, um eine Funktion zu deklarieren. Als Signaturen eingeführt wurden, musste der C-Ausschuss die No-Parameter aus der alten Syntax disambiguieren und führte die "void foo (void)" - Syntax ein. C++ nahm es aus Gründen der Kompatibilität. –

1

In C verwenden Sie ein void in einer leeren Funktionsreferenz, so dass 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, da Sie den Prototyp nicht auslassen können.

+1

„Prototyp“ bedeutet die Argumentliste Erklärung und Rückgabetyp:

Ich habe den C99-Standard im Detail zu interpretieren. Ich sage das, weil "Prototyp" mich verwirrt hat, was du zuerst gemeint hast. –

31

Ich stelle fest, um Ihre Frage zu C++ gehört, aber wenn es um C kann die Antwort kommt in K & R, Seiten 72-73 zu finden:

Wenn darüber hinaus eine Funktion Erklärung Argumente nicht enthält, wie in

double atof(); 

das auch gemacht wird bedeuten, dass nichts über die Argumente von atof angenommen werden soll; Alle Parameterüberprüfungen sind deaktiviert. Diese spezielle Bedeutung der leeren Argumentliste soll älteren C Programmen erlauben, mit neuen Compilern zu kompilieren. Aber es ist eine schlechte Idee, es mit neuen Programmen zu verwenden. Wenn die Funktion Argumente annimmt, deklarieren Sie sie; Wenn keine Argumente benötigt, verwenden Sie void.

4

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 Paragraf 8: Deklaratoren sagt:

8.3.5 Änderung: In C++, eine Funktion mit einer leeren Parameterliste deklariert keine Argumente hat. 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 

Rationale: Dies ist eine fehlerhafte Funktionsaufrufe zu vermeiden (das heißt, Funktionsaufrufe mit der falschen Zahl oder die Art der Argumente ).

Auswirkung auf das ursprüngliche Feature: Wechseln Sie in die Semantik des definierten Features. Diese Funktion wurde als „obsolescent“ in C markiert

8.5.3 Funktionen sagt:

4. Der Parameter-Deklaration-Klausel, um die Argumente fest, die angegeben werden können, und deren Verarbeitung , wenn die Funktion aufgerufen wird. [...] Wenn die Parameter-Deklaration-Klausel leer ist, übernimmt die Funktion keine Argumente. Die Parameterliste (void) entspricht der leeren Parameterliste.

C99

Wie in 11 von C++ erwähnt, gibt int f() nichts über die Argumente und ist obsolescent.

Es kann entweder zu Arbeitscode oder UB führen. https://stackoverflow.com/a/36292431/895245

+0

Ihr letzter Link hier ist falsch; Sie haben eine gelöschte Antwort von jemand anderem zu einer Frage zu C# und XML verknüpft. –

+0

@MarkAmery danke, repariere es. Fehlt eine Ziffer. –

Verwandte Themen