Maison  >  Article  >  développement back-end  >  Peut-on appeler récursivement « main() » en C malgré la norme qui l'interdit ?

Peut-on appeler récursivement « main() » en C malgré la norme qui l'interdit ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 20:26:29660parcourir

Can g   Recursively Call `main()` in C   Despite the Standard Forbidding It?

Appeler main() de manière récursive en C

La norme C dicte que l'appel de main() de manière récursive n'est pas autorisé. Cependant, le compilateur g autorise cette pratique, autorisant l'utilisation de code inhabituel tel que :

<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();
}

Lors de l'exécution :

> g++ g.cpp; ./a.out
y = 3
y = 6
y = 7</code>

L'examen du code assembleur révèle que main est invoqué de la même manière que toute autre fonction :

<code class="assembly">main:
        ...
        cmpl    , -12(%rbp)
        je      .L7
        call    main
        ...
.L7:
        ...
        leave
        ret</code>

Bien que ce comportement ne soit pas standardisé, g semble avoir une approche détendue pour faire respecter la norme, comme en témoigne son absence d'objections. Cependant, il émet un avertissement sarcastique lors de l'utilisation de l'indicateur -pedantic :

g.cpp:8: error: ISO C++ forbids taking address of function '::main'

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