Récursion dans la fonction main() : un comportement inattendu du compilateur
Les appels à la fonction main() ne sont généralement pas autorisés en C . Cependant, en pratique, cela peut être possible sur certaines plateformes, notamment sur les systèmes Linux avec le compilateur g. Voyons comment ce comportement est obtenu.
Dans l'exemple de code fourni :
<code class="cpp">#include <iostream> #include <cstdlib> int main() { cout << "!!!Hello World!!!" << endl; system("pause"); return main(); }</code>
L'appel à main() dans la fonction main() permet une boucle sans fin. Cependant, ce n'est pas un comportement C standard.
Magie du compilateur ou comportement non défini ?
Est-il possible d'obtenir la fonction en cours d'exécution à l'aide d'une variable magique ou d'une macro ? Non, il n'y a pas de telle disposition dans le standard C.
Exception du compilateur Linux
Malgré l'interdiction du standard, le compilateur Linux g compile le code avec les appels main() dans main() sans générer d’erreurs. Cela est dû à l'interprétation indulgente du compilateur du standard C.
Démonstration pratique
Considérez le code suivant :
<code class="cpp">#include <cstdlib> #include <iostream> using namespace std; int main() { int y = rand() % 10; // returns 3, then 6, then 7 cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
Lorsqu'il est compilé avec g , ce code génère un code assembleur qui ressemble à :
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
Dans ce code assembleur, main est appelée comme n'importe quelle autre fonction. L'appel à main() dans la fonction main() est traduit en un appel de fonction régulier.
Conclusion
Lorsque l'appel de main() depuis main() est non autorisé par le standard C, il peut être possible de le faire sur certaines plates-formes avec des compilateurs spécifiques qui tolèrent un tel comportement. Cependant, il est important de souligner qu'il ne s'agit pas du standard C et qu'il peut conduire à des résultats inattendus dans différents environnements ou versions de compilateurs.
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!