Maison >développement back-end >C++ >Pourquoi l'appel récursif de `main()` entraîne-t-il un comportement non défini en C ?

Pourquoi l'appel récursif de `main()` entraîne-t-il un comportement non défini en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-13 02:25:101011parcourir

Why Does Recursively Calling `main()` Lead to Undefined Behavior in C  ?

Appeler main pour appeler main : une quête non définie

L'extrait de code ci-dessous a soulevé des questions parmi les programmeurs :

int main () { 
    return main(); 
}

Il se compile sans erreurs mais ne parvient pas à terminer l'exécution, ce qui conduit à des spéculations sur son comportement.

Comportement non défini : le Enigme de main

Selon le standard C, [basic.start.main](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/ p0689r2.html#3.6.1) indique que "La fonction main ne doit pas être nommée par une expression." Cela implique qu'il est interdit d'appeler main au sein du programme.

Comportement du compilateur : avertissements ou silence ?

Les compilateurs peuvent gérer ce cas spécifique différemment. GCC, avec l'option -pedantic activée, émet un avertissement concernant l'utilisation illégale de main. Visual Studio reste cependant silencieux, choisissant de ne pas avertir de la nature récursive du code.

Que se passe-t-il lorsque vous appelez main ?

La réponse à cette question se situe dans le domaine du comportement indéfini. La norme ne définit pas ce qui doit se passer lorsque main est appelé dans le programme. En conséquence, tout comportement observé est imprévisible et dépendant de l'implémentation.

Conclusion

Appeler main au sein du programme est une action indéfinie et son comportement ne peut pas être prédit de manière fiable . Les compilateurs peuvent gérer ce cas différemment, en émettant des avertissements ou en échouant complètement à compiler. Tenter de définir le résultat d'un comportement indéfini est futile et peut conduire à des résultats inattendus et potentiellement dangereux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn