Différence entre main (void) et main () en C

Quelqu’un peut-il me dire la différence entre int main() et int main(void) ? Pourquoi les deux fonctionnent-ils et quel est l’argument par défaut de int main() ?

Aucune différence dans des circonstances ordinaires. Ce n’est pas un ‘argument par défaut de main ()’, car il n’a aucun argument.

Voici la circonstance inhabituelle. Si vous écrivez votre propre appel à main, then () vous permettra de lui transmettre les parameters de votre choix, tandis que (void) vous obligera à n’en transmettre aucun. Néanmoins, cela n’a aucune importance en ce qui concerne le cas 99,99999999%, qui est principalement invoqué par le moteur d’exécution pour lancer votre programme. Le runtime ne sait ni ne se soucie pas si vous écrivez () ou (void) .

Si vous codez le standard int main(int argc, char **argv) vous y retrouverez vos parameters de ligne de commande.

main() vous permet d’appeler main avec un nombre quelconque de parameters. main(void) vous oblige à appeler main sans paramètre. Alors:

 main(foo, bar); 

Convient à main() mais pas à main(void) – le compilateur génère une erreur.

Maintenant, si vous posez spécifiquement des questions sur le point d’entrée du programme, cela ne fait pas une différence. dans les deux cas, vous ne disposerez pas des arguments du programme (argc, argv, envp).

D’un sharepoint vue pratique, il n’y a pas de réelle différence. Avec int main(void) , vous déclarez explicitement que main ne prend aucun paramètre, vous ne pouvez donc pas l’invoquer avec aucun. Avec int main() , vous laissez ouverte la possibilité d’invoquer main avec certains parameters.

Cependant, sauf dans des situations étranges telles que le code de golf ou le code délibérément obfusqué, vous n’invoquez pas de toute façon – c’est le point d’entrée du programme, il est donc automatiquement appelé par le code de démarrage. De toute façon, le code de démarrage transmettra les arguments de ligne de commande. Par conséquent, vos choix ne changent pas la manière dont il est appelé, que vous utilisiez ou non les parameters passés.

La norme vous permet spécifiquement de définir des parameters main avec ou sans parameters (§5.1.2.2.1 / 1):

La fonction appelée au démarrage du programme s’appelle main. L’implémentation ne déclare aucun prototype pour cette fonction. Il doit être défini avec un type de retour de int et sans paramètre:

  int main(void) { /* ... */ } 

ou avec deux parameters (appelés ici argc et argv, bien que tous les noms puissent être utilisés, car ils sont locaux à la fonction dans laquelle ils sont déclarés):

  int main(int argc, char *argv[]) { /* ... */ } 

ou équivalent;

Bien qu’en dehors des balises spécifiées, la situation en C ++ est légèrement différente. En C, une déclaration de fonction comme:

 int f(); 

spécifie que f est une fonction renvoyant un int , mais ne donne aucune information sur le nombre ou le type de parameters que f pouvait attendre (ceci est principalement inclus pour la compatibilité avec l’ancien code – à la fois, c’était le seul moyen de déclarer une fonction C) En C ++, cette même déclaration déclare explicitement f comme une fonction ne prenant aucun paramètre. Par conséquent, toute tentative d’invocation de f avec un ou plusieurs parameters ne peut pas appeler cette fonction (elle doit invoquer une autre surcharge ou produire une erreur si aucune surcharge appropriée n’est trouvée).