web-dev-qa-db-fra.com

Quelle est la difference entre function () et function (void)?

J'ai entendu dire que c'est une bonne pratique d'écrire des fonctions qui ne reçoivent rien en tant que paramètre comme ceci:

int func(void);

Mais j'entends que la bonne façon d'exprimer cela est comme ceci:

int func();

Quelle est la différence entre ces deux déclarations de fonction en C et C++?

32
Grizzly

C et C++ sont différents à cet égard.

Norme en ligne C 2011

6.7.6.3 Déclarateurs de fonctions (y compris les prototypes)
...
10 Le cas particulier d'un paramètre sans nom de type void comme seul élément de la liste spécifie que la fonction n'a pas de paramètres.
...
14 Une liste d'identifiants ne déclare que les identifiants des paramètres de la fonction. Une liste vide dans un déclarant de fonction qui fait partie d'une définition de cette fonction spécifie que la fonction n'a pas de paramètres. La liste vide dans un déclarant de fonction qui ne fait pas partie d'une définition de cette fonction spécifie qu'aucune information sur le nombre ou les types de paramètres n'est fournie.145)

En bref, une liste de paramètres vide dans une fonction déclaration indique que la fonction prend un nombre de paramètres non spécifié, tandis qu'une liste de paramètres vide dans une fonction definition indique que la fonction prend non paramètres.

T foo( void ); // declaration, foo takes no parameters
T bar();       // declaration, bar takes an *unspecified* number of parameters

T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... }       // definition, bar takes no parameters

En ce qui concerne C, vous ne devez jamais utiliser une liste d'identificateurs vide dans une définition de déclaration de fonction ou. Si une fonction n'est pas censée prendre de paramètres, spécifiez-la en utilisant void dans la liste des paramètres.

norme C++ en ligne

8.3.5 Fonctions [dcl.fct]
...
4 La clause clause-déclaration-de-paramètre détermine les arguments qui peuvent être spécifiés et leur traitement lors de l'appel de la fonction. [ Remarque: la clause-déclaration-de-paramètre est utilisée pour convertir les arguments spécifiés lors de l'appel de fonction; voir 5.2.2. - end note] Si la clause-déclaration-de-paramètre est vide, la fonction ne prend aucun argument. Une liste de paramètres constituée d'un seul paramètre sans nom de type non dépendant void équivaut à une liste de paramètres vide. À l'exception de ce cas particulier, un paramètre ne doit pas avoir le type cv void. Si la clause-de-déclaration-de-paramètre se termine par un Ellipsis ou un pack de paramètres de fonction (14.5.3), le nombre d'arguments doit être égal ou supérieur au nombre de paramètres qui n'ont pas un argument par défaut et ne sont pas des packs de paramètres de fonction. Où syntaxiquement correct et où "..." ne fait pas partie d'un abstract-declarator, ", ..." est synonyme de "...". [ Exemple: la déclaration
    int printf(const char*, ...);
déclare une fonction qui peut être appelée avec différents nombres et types d'arguments.
    printf("hello world");
    printf("a=%d b=%d", a, b);
Cependant, le premier argument doit être d'un type qui peut être converti en const char* - exemple final] [ Remarque: L'en-tête standard <cstdarg> contient un mécanisme pour accéder aux arguments passés à l'aide des points de suspension (voir 5.2.2 et 18.10). - note de fin]

Dans le cas de C++, une liste de paramètres vide dans une déclaration ou une définition indique que la fonction ne prend aucun argument et équivaut à utiliser une liste de paramètres de void.

20
John Bode

En C, une fonction avec une liste de paramètres vide () peut prendre n'importe quoi pour ses arguments. Littéralement n'importe quoi. Ceci est généralement utilisé pour implémenter une fonction qui peut prendre n nombre variable d'arguments , bien que de nos jours, il soit préférable d'utiliser la syntaxe Ellipsis plus explicite (...) pour ces fonctions.

En C, une fonction avec la liste des paramètres (void) ne prend explicitement rien pour ses arguments. Cela signifie que le compilateur peut vous dire que vous avez fait une erreur si vous essayez de passer quelque chose.

En C++, ces déclarations de fonctions sont équivalentes. Une liste de paramètres vide signifie "aucun paramètre" comme void.

36
Ixrec