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

Considérez ces deux définitions de fonction:

void foo() { } void foo(void) { } 

Y a-t-il une différence entre ces deux? Sinon, pourquoi y a-t-il un argument void ? Des raisons esthétiques?

En C :

  • void foo() signifie “une fonction qui prend un nombre non spécifié d’arguments de type non spécifié”
  • void foo(void) signifie “une fonction foo ne prenant aucun argument”

En C ++ :

  • void foo() signifie “une fonction qui ne prend aucun argument”
  • void foo(void) signifie “une fonction foo ne prenant aucun argument”

En écrivant foo(void) , nous obtenons donc la même interprétation à travers les deux langages et rendons nos en-têtes multilingues (bien que nous ayons généralement besoin de faire plus de choses avec les en-têtes pour les rendre multilingues). extern "C" si nous compilons C ++).

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

En outre, si une déclaration de fonction n’inclut pas d’arguments, comme dans

 double atof(); 

cela signifie aussi que rien ne doit être supposé à propos des arguments de atof; tout contrôle des parameters est désactivé. Cette signification particulière de la liste d’arguments vide est destinée à permettre aux programmes C plus anciens de comstackr 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 standard 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 Clause 8: les déclarants déclarent :

8.3.5 Changement: en C ++, une fonction déclarée avec une liste de parameters vide ne prend aucun argument. En C, une liste de parameters vide signifie que le nombre et le type des arguments de la fonction sont inconnus.

Exemple:

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

Justification: Cela évite les appels de fonction erronés (c.-à-d. Appels de fonction avec le mauvais numéro ou le type d’arguments).

Effet sur la fonctionnalité d’origine: Modification de la sémantique d’une fonctionnalité bien définie. Cette fonctionnalité était marquée comme «obsolescente» en C.

8.5.3 fonctions dit:

4. La clause-declaration-clause détermine les arguments pouvant être spécifiés et leur traitement lorsque la fonction est appelée. […] Si la clause de déclaration de paramètre est vide, la fonction ne prend aucun argument. La liste de parameters (void) est équivalente à la liste de parameters vide.

C99

Comme mentionné dans C ++ 11, int f() ne spécifie rien sur les arguments et est obsolète.

Il peut soit conduire à un code de travail ou UB.

J’ai interprété la norme C99 en détail à l’ adresse suivante : https://stackoverflow.com/a/36292431/895245

En C, vous utilisez un vide dans une référence de fonction vide pour que le compilateur ait un prototype et que ce prototype n’ait “aucun argument”. En C ++, vous n’avez pas à dire au compilateur que vous avez un prototype parce que vous ne pouvez pas laisser le prototype.