Heim > Artikel > Backend-Entwicklung > Kann g „main()“ in C rekursiv aufrufen, obwohl der Standard dies verbietet?
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!