2008-09-09 7 views

Répondre

263

Dans C:

  • void foo() signifie "une fonction foo prenant un nombre non spécifié d'arguments de type non spécifié"
  • void foo(void) moyens "une fonction foo prenant aucun argument"

Dans C++:

  • void foo() signifie « une fonction foo sans argument »
  • void foo(void) signifie « une fonction foo sans argument »

En écrivant foo(void), par conséquent, nous obtenons la même interprétation dans les deux langues et rendre nos en-têtes multilingues (bien que nous ayons habituellement besoin de faire plus de choses dans les en-têtes pour les rendre vraiment inter-langues; à savoir, les envelopper dans un extern "C" si nous compilons C++).

+4

Mais si C++ avait demandé le 'void', alors il aurait pu éviter le problème de" l'analyse la plus vexante ". –

+4

Certes, mais il y a tellement d'autres paresseuses en C++, il n'y a pas vraiment de raison de kvetching à propos de l'une d'entre elles. – DrPizza

+9

Sur une question récente, @James Kanze a posté un article intéressant. Repost ici pour éviter de le perdre: les premières versions de C ne permettaient pas de spécifier le nombre de paramètres qu'une fonction pouvait prendre, ainsi 'void foo()' était la seule syntaxe à déclarer une fonction. Lorsque les signatures ont été introduites, le comité C a dû désambiguïser le non-paramètre de l'ancienne syntaxe, et a introduit la syntaxe 'void foo (void)'. C++ l'a pris pour des raisons de compatibilité. –

1

En C, vous utilisez un void 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 besoin de dire au compilateur que vous avez un prototype car vous ne pouvez pas omettre le prototype.

+1

« prototype », la déclaration de liste d'arguments et le type de retour. Je dis cela parce que «prototype» m'a troublé quant à ce que vous vouliez dire au début. –

31

Je me rends compte de votre question porte sur C++, mais quand il vient à C la réponse peut être trouvée dans K & R, pages 72-73:

En outre, si une déclaration de fonction ne comprend pas d'arguments, comme dans

double atof(); 

qui est pris trop à dire que rien ne doit être pris sur les arguments de atof; tous les contrôles de paramètres sont désactivés. Cette signification spéciale de la liste d'arguments vides est destinée à permettre aux anciens programmes C de 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; si il ne prend aucun argument, utilisez void.

4

C++ 11 N3337 projet de norme

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 L'article 8: déclarateurs dit:

8.3.5 Changement: C++, une fonction déclarée avec une liste de paramètres vide ne prend aucun argument. En C, une liste vide de paramètres 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 permet d'éviter les appels de fonction erronés (par exemple, la fonction appelle le mauvais numéro ou le type de arguments).

Effet sur la fonction d'origine: passage à la sémantique d'une entité bien définie. Cette fonction a été marquée comme « obsolescents » dans C.

8.5.3 fonctions dit:

4. Le paramètre-déclaration article détermine les arguments qui peuvent être spécifiées et leur traitement , lorsque la fonction est appelée. [...] Si la clause parameter-declaration-clause est vide, la fonction ne prend aucun argument. La liste des paramètres (void) est équivalente à la liste des paramètres vides.

C99

Comme mentionné par 11 C++, int f() spécifie rien sur les arguments, et est obsolescent.

Il peut soit conduire au code de travail ou UB.

avoir interprété la norme C99 en détail: https://stackoverflow.com/a/36292431/895245

+0

Votre dernier lien ici est faux; vous avez lié à la réponse supprimée de quelqu'un d'autre sur une question sur C# et XML. –

+0

@MarkAmery merci, l'a réparé. Il manquait un chiffre. –

Questions connexes