18

C++03 3.6.1.3:関数 main は、プログラム内で使用してはなりません (3.2)。...

なぜこのルールが存在するのだろうか...メインが使用された場合に問題になるシステム/実装を誰かが知っていますか?

PS 1. という用語の定義を知っていますused。2. main() から単一の MyMain() を呼び出し、代わりに MyMain() を使用するなどの簡単な回避策があることを私は知っています。3. 問題は、制限が存在しない場合に問題が発生する現実世界の実装に関するものです。ありがとう!

4

3 に答える 3

37

他の回答に加えて: c++ 仕様では、main が呼び出される前にすべての静的初期化が行われることが保証されています。

コードが main を呼び出すことができる場合、静的スコープのオブジェクトが main を呼び出す可能性があります。この場合、基本的な保証に違反しています。

多くのオブジェクトは常に静的スコープでインスタンス化されるように特別に記述されていないため、仕様では「静的スコープのオブジェクトは main() を呼び出すべきではありません」とは言えません。また、コンストラクターが main() を呼び出すべきではないとも言えません。これは、コンストラクターがメソッドを呼び出していないこと、メソッドを呼び出していること、場合によっては main() を呼び出していることを監査して証明することが非常に難しいためです。

于 2010-11-10T12:51:32.520 に答える
17

mainこれにより、コードを前に付けてグローバルと静的を構築し、環境とコマンドライン引数を識別するパラメーターを受け入れ、それらを C++ の argc/argv/env 規則にマップし、適切なスタックと例外フレームワークを構築する実装の自由が保持されると思います。すべての環境で、実行可能イメージが初期化コードとして指定された他のシンボルを の前に実行できるわけではないことを考慮してくださいmain()

main()同様に、 C および C++ の 0/非ゼロ規則からその特定の OS で使用される実際の成功/失敗値へのマッピングを伴う OS への呼び出しとともに、クリーンアップ コードを に追加することができます。

その結果、他の場所から呼び出すmainと、アプリケーション フレームワークの 2 回目の再初期化が試行されたり、OS が意図せず終了したりする可能性があります。

于 2010-11-10T11:49:19.317 に答える
6

C++main()は、int などを返すように定義する必要があるにもかかわらず、例外処理の構文が異なり、値を返す必要がない奇妙な小さな関数です。これが実際の実装に影響するかどうかはわかりませんが、この制限は、コンパイラの作成者に実装方法の自由度を与えるために存在すると思いますmain()

于 2010-11-10T11:49:09.357 に答える