web-dev-qa-db-fra.com

Différence entre void main et int main?

Est-il important de savoir de quelle manière je déclare mes programmes C++?

53
Kredns

La différence est que l'un est la bonne façon de définir main, et l'autre non.

Et oui, ça compte. Soit

int main(int argc, char** argv)

ou

int main()

sont la bonne définition de votre main selon la spécification C++.

void main(int argc, char** argv)

n'est pas et était, IIRC, une perversité fournie avec les anciens compilateurs C++ de Microsoft.

https://isocpp.org/wiki/faq/newbie#main-returns-int

69
Alan

Bjarne Stroustrup l'a clairement expliqué:

La définition void main() n'est pas et n'a jamais été C++, ni même C.

Voir référence .

25
vobject

Tu devrais utiliser int main. Les normes C et C++ spécifient que main doit renvoyer une valeur.

12
RedBlueThing

Pour C++, seul int est autorisé. Pour C, C99 indique que seul int est autorisé. La norme antérieure permettait un retour void.

En bref, toujours int.

9
Joe

Le fait est que les programmes C (et C++ identiques) retournent toujours (devraient?) Une valeur de succès ou un code d'erreur, ils doivent donc être déclarés de cette façon.

4
Svante

En C++, main() doit retourner int. Cependant, C99 permet à main() d'avoir un type de retour nonint. Voici l'extrait de la norme C99.

5.1.2.2.1 Démarrage du programme

La fonction appelée au démarrage du programme est nommée 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ètres:

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

ou avec deux paramètres (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; ou d'une autre manière définie par l'implémentation.

Notez également que gcc compile void main() bien que pratiquement, il fasse return 0; en rencontrant une accolade de fermeture.

3
Masked Man

Il y a longtemps, j'ai trouvé cette page (void main (void)) qui contenait de nombreuses raisons en dehors de l'argument "la norme dit qu'elle n'est pas valide". Sur certains systèmes d'exploitation/architectures, cela pourrait endommager la pile et/ou provoquer d'autres événements désagréables.

3
X-Istence

Si vous respectez les spécifications, vous devez toujours déclarer main renvoyant un int.

En réalité, cependant, la plupart des compilateurs vous permettront de vous en tirer avec l'un ou l'autre, donc la vraie différence est que vous voulez/devez renvoyer une valeur au shell.

2
Electrons_Ahoy