Introduction : La question principale que même les experts se posent
\n\nAvez-vous déjà réfléchi à pourquoi chaque programme en C++ commence par int main(), et non par void main() ? Et que se passe-t-il réellement lorsque vous écrivez return 0 ? Cette question est un véritable hit sur Stack Overflow, rassemblant des milliers de vues et des centaines de commentaires. Un sujet apparemment élémentaire, mais qui cache tout un ensemble de subtilités qui séparent C et C++, ainsi que les développeurs débutants et expérimentés.
Dans cet article, nous ne donnerons pas simplement une réponse sèche. Nous allons comparer les approches en C et en C++, analyser les normes, montrer des exemples de code réels et expliquer comment travailler correctement avec la valeur de retour de main(), afin que votre code soit non seulement fonctionnel, mais aussi portable. Que vous appreniez le C++ ou que vous en écriviez tous les jours, cet article est pour vous.
Réponse courte : que doit retourner main() en C++ ?
\n\nSi vous êtes pressé, voici l'essentiel : la fonction main() en C++ doit retourner int. C'est une exigence stricte de la norme (de C++98 à C++23). La valeur de retour informe le système d'exploitation si le programme s'est terminé avec succès.
Voici le code correct minimal :
\n\n#include <iostream>\n\nint main() {\n std::cout << "Hello, World!" << std::endl;\n return 0; // Fin réussie\n}\n\nMais ce n'est que la partie émergée de l'iceberg. Creusons un peu plus.
\n\nPourquoi int et non void ? Contexte historique
\n\nDans les toutes premières versions de C (avant la norme ANSI C), le type de main() n'était pas strictement défini. De nombreux compilateurs permettaient d'écrire void main(), et cela fonctionnait. Cependant, avec l'arrivée de la normalisation (C89/C90 pour C et C++98 pour C++), il a été décidé que main() devait retourner un code de sortie au système d'exploitation.
Pourquoi ? Parce que les scripts, les Makefiles et d'autres programmes vérifient souvent comment votre processus s'est terminé. Le code de retour 0 signifie « succès », et toute valeur non nulle signifie « erreur » (ou un type d'erreur spécifique). Si main() était void, vous ne pourriez pas transmettre cette information.
En C++, la situation est encore plus stricte. La norme C++ (section [basic.start.main]) dit explicitement : main() doit être de type int. Toute autre déclaration (par exemple, void main()) est une extension du compilateur et rend le code non portable.
Comparaison C et C++ : quelle est la différence ?
\n\nBien que les deux langages exigent int main(), il existe plusieurs différences clés :
- \n
- Return 0 implicite en C++ : Si vous n'écrivez pas de
returnà la fin demain(), C++ insère automatiquementreturn 0. En C (à partir de C99), cela fonctionne aussi, mais dans les anciennes normes (C89), l'absence de return entraînait un comportement indéfini. \n - Arguments de la ligne de commande : En C++, vous pouvez déclarer
int main(int argc, char* argv[])ouint main(). En C, il existe également une troisième variante avec l'environnement (char* envp[]), mais elle n'est pas standardisée en C++ (bien que de nombreux compilateurs la supportent). \n - void main() : En C, certains compilateurs (par exemple, pour les systèmes embarqués) peuvent autoriser
void main(). En C++, c'est une erreur grave, et le code ne compilera pas en mode strict. \n
Exemple pour C++ (fonctionne toujours) :
\n\nint main() {\n std::cout << "C++ retournera automatiquement 0" << std::endl;\n // return 0; // peut être omis\n}\n\nExemple pour C (nécessite un return explicite dans les anciennes normes) :
\n\n#include <stdio.h>\n\nint main() {\n printf("En C89, il faut retourner explicitement 0\\n");\n return 0; // obligatoire\n}\n\nQue signifient les codes de retour ? Analyse avec des exemples
\n\nLe code de retour est un