2

私は大学のプロジェクトを書いています。標準 C99 で記述します。要件の 1 つは、exit();がないことです。関数。同様の機能を実装することは可能ですか?終了を検出するために、マイナスのargcでmainを呼び出す関数を作成しようとしました。最初のメインが続くので、それはばかげた試みでした。

プロジェクトの説明だけで、exit() による exit の使用に対してスコアが減少することが指定されていました。ポインターを介して実行するコードを要求し、関数の戻り値でエラーを返すことを理解しています。私は練習にもっと興味があります。自分のためだけに。

4

2 に答える 2

8

あなたは要件を誤解していると思います: 彼らはおそらくdo not use exit(). これは、独自の を実装することになっているという意味ではなくexit()、まったく逆です。おそらく、プログラムの唯一の終了点が main-function の最後 (または main 関数内の return-statement) になることを意味します。良いプログラミング スタイルと見なされます。

于 2012-11-30T19:57:09.440 に答える
1

exit()は、オペレーティング システム (Linux? Windows? 組み込みシステム?) がどのように機能するかを知らずに自分で実装できないシステム レベルの機能です。abort()Daniel Fischer が述べたように、基本的に exit が行うのと同じことを行い、プログラムを終了する which を呼び出すことができます。

明示的に呼び出さずにプログラムを中止させる「ハック」は他にもありますexit()が、これらは単なるハックであり、プロダクション コードでは使用しないでください。

  1. C リンケージを使用して C++ 関数を作成し、例外をスローする

    extern "C" MyExit() { throw std::exception(); }

  2. signal()SIGKILL で呼び出す

  3. 電話abort()

  4. 呼び出した関数に到達するまでコール スタックをアンワインドするアセンブリ コードを記述しmain、戻り値を適切なリターン レジスタに挿入してそこから移動します。ABI には直接アクセスできないため、純粋な C でこれを行うことはできないと思います。しかし、少なくともこれは、オペレーティング システム (ABI のみ) を必要としない唯一の方法です。

于 2015-04-28T22:28:08.757 に答える