La norme C décrit la fonction principale comme le point d'entrée fondamental de chaque programme. Cependant, la question se pose : "Est-il possible d'appeler main() depuis l'intérieur de lui-même ?"
Selon le standard C, non. La fonction principale, une fois définie et exécutée, marque le début et la fin du programme. L'appel récursif de main() viole ce principe fondamental.
En pratique, cependant, certains compilateurs comme g de Linux permettent l'appel non conventionnel de main() dans main(). Ce comportement n'est pas explicitement pris en charge par la norme mais est autorisé par l'implémentation du compilateur.
Par exemple, considérons le code suivant :
<code class="c++">#include <iostream> #include <cstdlib> using namespace std; int main() { int y = rand() % 10; // random number generation cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
Ce code effectue une génération de nombres aléatoires, et si le Le nombre généré n'est pas égal à 7, il appelle récursivement main().
L'examen du code assembleur généré par g révèle que main() est invoqué comme n'importe quelle autre fonction :
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
Il convient de noter que pendant que g compile un tel code, il génère un avertissement avec l'indicateur -pedantic pour vous rappeler qu'il viole la norme C :
g.cpp:8: error: ISO C++ forbids taking address of function '::main'
Bien que l'appel de main() en lui-même puisse fonctionner dans certaines situations, il n'est pas officiellement sanctionné par la norme C. Il s'agit d'une violation du comportement standard et peut conduire à des résultats indéfinis sur différents compilateurs et plates-formes. En tant que tel, il est fortement déconseillé de s'appuyer sur cette pratique non conventionnelle dans le code de production.
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!