ホームページ  >  記事  >  バックエンド開発  >  C で main() を再帰的に呼び出すことはできますか?

C で main() を再帰的に呼び出すことはできますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 20:45:02281ブラウズ

Can You Call main() Recursively in C  ?

C 内で main() を呼び出す

C 標準では、あらゆるプログラムの基本的なエントリ ポイントとして main 関数の概要を示しています。ただし、「main() を内部から呼び出すことは可能ですか?」

機能上の制約

C 標準によれば、いいえです。 main 関数は、定義して実行すると、プログラムの開始と終了をマークします。 main() を再帰的に呼び出すことは、この基本原則に違反します。

実際の実装

しかし、実際には、Linux の g などの特定のコンパイラでは、main() 内での main() の型破りな呼び出しが許可されています。この動作は標準では明示的にサポートされていませんが、コンパイラの実装では許可されています。

たとえば、次のコードを考えてみましょう。

<code class="c++">#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    int y = rand() % 10; // random number generation
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>

このコードは乱数生成を実行します。生成された数値は 7 ではなく、main() を再帰的に呼び出します。

アセンブリ レベルの分析

g によって生成されたアセンブリ コードを調べると、main() が他の関数と同じように呼び出されていることがわかります。 :

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

コンパイラ警告

g がそのようなコードをコンパイルする際、C 標準に違反していることを通知する -pedantic フラグ付きの警告が生成されることに注意してください。

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

結論

それ自体の中で main() を呼び出すことは状況によっては機能する可能性がありますが、C 標準によって正式に認可されていません。これは標準の動作に違反しており、さまざまなコンパイラやプラットフォーム間で未定義の結果が生じる可能性があります。したがって、実稼働コードでこの型破りな慣行に依存することは強くお勧めできません。

以上がC で main() を再帰的に呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。