Question

Considérez ces deux définitions de fonctions :

void foo() { }

void foo(void) { }

Y a-t-il une différence entre ces deux ?Si non, pourquoi le void argument là-bas ?Des raisons esthétiques ?

Était-ce utile?

La solution

Dans C:

  • void foo() signifie « une fonction foo prenant un nombre indéterminé d'arguments de type non spécifié"
  • void foo(void) signifie « une fonction foo ne prends aucun argument"

Dans C++:

  • void foo() signifie « une fonction foo ne prends aucun argument"
  • void foo(void) signifie « une fonction foo ne prends aucun argument"

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 quelques modifications supplémentaires aux en-têtes pour les rendre véritablement multilingues ;à savoir, enveloppez-les dans un extern "C" si nous compilons du C++).

Autres conseils

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 est également considéré comme signifiant que rien ne doit être supposé sur les arguments d'ATOf;toute vérification des paramètres est désactivée.Cette signification particulière de la liste d'arguments vides est destinée à permettre aux programmes C plus anciens de se compiler avec de nouveaux compilateurs.Mais c'est une mauvaise idée de l'utiliser avec de nouveaux programmes.Si la fonction prend des arguments, déclarez-les ;S'il ne prend aucun argument, utilisez le vide.

Projet de norme C++11 N3337

Il n'y a pas de différence.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

Annexe C « Compatibilité » C.1.7 Article 8 :déclarants dit:

8.3.5 Modification :En C++, une fonction déclarée avec une liste de paramètres vide ne prend aucun argument.En C, une liste de paramètres vides signifie que le nombre et le type des arguments de fonction sont inconnus.

Exemple:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

Raisonnement:Il s'agit d'éviter les appels de fonction erronés (c'est-à-dire les appels de fonction avec le mauvais numéro ou le type d'arguments).

Effet sur la fonctionnalité originale :Changement vers la sémantique d'une fonctionnalité bien définie.Cette fonctionnalité a été marquée comme « obsolète » en C.

8.5.3 fonctions dit:

4.La clause de décaration paramètre détermine les arguments qui peuvent être spécifiés et leur traitement lorsque la fonction est appelée....] Si la clause de décaration de paramètre est vide, la fonction ne prend aucun argument.La liste de paramètres (void) est équivalente à la liste de paramètres vide.

C99

Comme mentionné par C++11, int f() ne précise rien sur les arguments et est obsolète.

Cela peut conduire soit à un code fonctionnel, soit à UB.

J'ai interprété la norme C99 en détail sur : https://stackoverflow.com/a/36292431/895245

En C, vous utilisez un void dans une référence de fonction vide afin que le compilateur ait un prototype et que ce prototype n'ait "aucun argument".En C++, vous n'êtes pas obligé d'indiquer au compilateur que vous disposez d'un prototype car vous ne pouvez pas omettre le prototype.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top