Rekursion in der Funktion main(): Ein unerwartetes Compilerverhalten
Aufrufe der Funktion main() sind in C im Allgemeinen nicht zulässig. In der Praxis kann dies jedoch auf einigen Plattformen möglich sein, insbesondere auf Linux-Systemen mit dem g-Compiler. Sehen wir uns genauer an, wie dieses Verhalten erreicht wird.
Im bereitgestellten Codebeispiel:
<code class="cpp">#include <iostream> #include <cstdlib> int main() { cout << "!!!Hello World!!!" << endl; system("pause"); return main(); }</code>
Der Aufruf von main() innerhalb der main()-Funktion ermöglicht eine Endlosschleife. Dies ist jedoch kein Standard-C-Verhalten.
Compiler-Magie oder undefiniertes Verhalten?
Ist es möglich, die aktuell laufende Funktion mithilfe einer magischen Variablen oder eines Makros abzurufen? Nein, eine solche Bestimmung gibt es im C-Standard nicht.
Linux-Compiler-Ausnahme
Trotz des Verbots des Standards kompiliert der Linux-g-Compiler Code mit darin enthaltenen main()-Aufrufen main() ohne Fehler auszulösen. Dies liegt an der nachsichtigen Interpretation des C-Standards durch den Compiler.
Praktische Demonstration
Berücksichtigen Sie den folgenden Code:
<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>
Beim Kompilieren mit g generiert dieser Code einen Assemblercode, der wie folgt aussieht:
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
In diesem Assemblercode wird main wie jede andere Funktion aufgerufen. Der Aufruf von main() in der Funktion main() wird in einen regulären Funktionsaufruf übersetzt.
Fazit
Während der Aufruf von main() aus main() heraus erfolgt Obwohl dies im C-Standard nicht zulässig ist, ist dies möglicherweise auf bestimmten Plattformen mit bestimmten Compilern möglich, die ein solches Verhalten tolerieren. Es ist jedoch wichtig zu betonen, dass dies kein Standard-C ist und in verschiedenen Umgebungen oder Compilerversionen zu unerwarteten Ergebnissen führen kann.
Das obige ist der detaillierte Inhalt vonKann sich die Funktion main() in C selbst aufrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!