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
Libérer: 2024-11-03 00:09:02
original
952 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal