Maison >développement back-end >C++ >La fonction main() peut-elle s'appeler en C ?

La fonction main() peut-elle s'appeler en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 00:09:02953parcourir

Can the main() function call itself in C  ?

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!

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