Que doit retourner main() en C++ ? Comparaison avec C et normes

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : La question principale que même les experts se posent

\n\n

Avez-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.

\n\n

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.

\n\n

Réponse courte : que doit retourner main() en C++ ?

\n\n

Si 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.

\n\n

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\n

Mais ce n'est que la partie émergée de l'iceberg. Creusons un peu plus.

\n\n

Pourquoi int et non void ? Contexte historique

\n\n

Dans 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.

\n\n

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.

\n\n

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.

\n\n

Comparaison C et C++ : quelle est la différence ?

\n\n

Bien que les deux langages exigent int main(), il existe plusieurs différences clés :

\n\n
    \n
  • Return 0 implicite en C++ : Si vous n'écrivez pas de return à la fin de main(), C++ insère automatiquement return 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[]) ou int 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
\n\n

Exemple pour C++ (fonctionne toujours) :

\n\n
int main() {\n    std::cout << "C++ retournera automatiquement 0" << std::endl;\n    // return 0; // peut être omis\n}
\n\n

Exemple 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\n

Que signifient les codes de retour ? Analyse avec des exemples

\n\n

Le code de retour est un

Blogs

Book Recommendations