283 votes

Y a-t-il une différence entre foo(void) et foo() en C++ ou C

Considérons ces deux définitions de fonction

void foo(){}

void foo(void){}

Y a-t-il une différence entre les deux ? Si non, pourquoi l'argument du vide existe-t-il ? Des raisons esthétiques ?

358voto

DrPizza Points 9355

La raison principale est de parvenir à une interprétation cohérente des en-têtes qui sont partagés entre C et C++.

En C :
void foo() signifie "une fonction foo en prenant un nombre non spécifié d'arguments de type non spécifié".
void foo(void) signifie "une fonction foo ne pas accepter d'arguments"

En C++ :
void foo() signifie "une fonction foo ne pas accepter d'arguments"
void foo(void) signifie "une fonction foo ne pas accepter d'arguments"

En écrivant foo(void) Par conséquent, nous obtenons la même interprétation dans les deux langues et rendons nos en-têtes multilingues (bien que nous devions généralement apporter d'autres modifications aux en-têtes pour qu'ils soient réellement multilingues, notamment en les enveloppant dans une balise extern "C" si nous compilons du C++).

42voto

Kyle Cronin Points 35834

Je réalise que votre question concerne le C++, mais en ce qui concerne le C, la réponse se trouve dans K&R, pages 72-73 :

De plus, si une déclaration de fonction ne comprend pas d'arguments, comme dans

double atof();

cela aussi est considéré comme signifiant que rien ne doit être supposé au sujet des arguments de atof ; toute vérification des paramètres est désactivée. Cette signification spéciale de la liste d'arguments vide est destinée à permettre aux anciens programmes C de compiler avec les nouveaux compilateurs. Mais c'est une mauvaise idée de l'utiliser avec les nouveaux programmes. Si la fonction prend des arguments, déclarez-les. elle ne prend pas d'arguments, utilisez void.

3voto

Paul Tomblin Points 83687

En C, vous utilisez un void dans une référence de fonction vide pour que le compilateur ait un prototype, et ce prototype est "no arguments". En C++, vous n'avez pas besoin de dire au compilateur que vous avez un prototype, car vous ne pouvez pas omettre le prototype.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X