Est-il important de savoir de quelle manière je déclare mes programmes C++?
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.
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 .
Tu devrais utiliser int main
. Les normes C et C++ spécifient que main
doit renvoyer une valeur.
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
.
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.
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.
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.
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.