Heim  >  Artikel  >  Backend-Entwicklung  >  Kann g „main()“ in C rekursiv aufrufen, obwohl der Standard dies verbietet?

Kann g „main()“ in C rekursiv aufrufen, obwohl der Standard dies verbietet?

Susan Sarandon
Susan SarandonOriginal
2024-10-31 20:26:29660Durchsuche

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

Rekursiver Aufruf von main() in C

Der C-Standard schreibt vor, dass der rekursive Aufruf von main() nicht zulässig ist. Der g-Compiler lässt diese Vorgehensweise jedoch zu und ermöglicht ungewöhnlichen Code wie:

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

Bei der Ausführung:

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

Eine Untersuchung des Assemblercodes zeigt, dass main ähnlich wie jede andere Funktion aufgerufen wird :

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

Obwohl dieses Verhalten nicht standardisiert ist, scheint g bei der Durchsetzung des Standards einen lockeren Ansatz zu verfolgen, was sich darin zeigt, dass es keine Einwände gibt. Bei Verwendung der Flagge -pedantic wird jedoch eine sarkastische Warnung ausgegeben:

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

Das obige ist der detaillierte Inhalt vonKann g „main()“ in C rekursiv aufrufen, obwohl der Standard dies verbietet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn