Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah g Memanggil `main()` secara Rekursif dalam C Walaupun Standard Melarangnya?

Bolehkah g Memanggil `main()` secara Rekursif dalam C Walaupun Standard Melarangnya?

Susan Sarandon
Susan Sarandonasal
2024-10-31 20:26:29658semak imbas

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

Memanggil main() secara rekursif dalam C

Piawaian C menetapkan bahawa memanggil main() secara rekursif tidak dibenarkan. Walau bagaimanapun, pengkompil g membenarkan amalan ini, membenarkan kod luar biasa seperti:

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

Setelah dilaksanakan:

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

Memeriksa kod pemasangan mendedahkan bahawa utama digunakan sama dengan mana-mana fungsi lain :

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

Walaupun tingkah laku ini tidak diseragamkan, g nampaknya mempunyai pendekatan yang santai untuk menguatkuasakan standard, seperti yang dibuktikan oleh kekurangan bantahannya. Walau bagaimanapun, ia mengeluarkan amaran sarkastik apabila menggunakan bendera -pedantic:

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

Atas ialah kandungan terperinci Bolehkah g Memanggil `main()` secara Rekursif dalam C Walaupun Standard Melarangnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn