22

データ ファイルを読み取り、テキストを解析し、そのデータに対して何らかの処理を行う簡単なアプリケーションを作成しました。データ ファイルは main() 関数で開かれます。ファイルが正しく開かれていないと判断された場合、exit() 関数を使用することは良いプログラミング方法ですか? 例えば:

if (!file.is_open() ){
     exit(1);
}

さらに、私のプログラムには、ファイル内のデータを解析する別の関数があります。この関数は main() によって呼び出されます。関数がデータにエラーを見つけた場合、エラーメッセージを出力した後、プログラムを停止させたいです。このような状況では、構文解析関数内で exit() 関数を使用しても問題ありませんか? main() 関数に制御を戻さずに関数が単独でプログラムを終了できるようにするのはあまり整然としていないように思われるため、この質問をしています。(この質問がかなり明白に思われる場合は申し訳ありません..私はC ++とプログラミング全般に不慣れです)。

4

6 に答える 6

20

関数からの呼び出しexitは、動作が明確に定義されているという意味で「悪い」わけではありません。そうすることに根本的な問題はありません。

ただし、たとえばライブラリに格納される可能性のある関数を作成している場合、exitそこから呼び出すことは一般的に悪い習慣です。呼び出し元のコードにエラーを通知する方がはるかに優れています (たとえば、特定の戻り値または例外を介して)。 ) 呼び出し元のコードに何をすべきかを決定させます。(ただし、完全に有効な場合もあります。たとえば、 という関数を作成している場合quit_if_file_not_found、ユーザーは終了を予期しています。)

あなたの場合、解析関数はおそらく を呼び出すべきではありませんexit: たとえば、将来のある時点で、最初のファイル名の解析が失敗した場合にメイン コードでユーザーに別のファイル名を要求することが必要になる場合があります。解析ルーチンがプログラムを終了させる場合は、メイン コードとその関数の両方を変更する必要があります。エラー状態を通知していた場合は、 のロジックを変更するだけで済みますmain

(そしてexit、エラー メッセージを出力したり、上記のように何かをログに記録したりしないでください。コードで発生した問題を修正する方法がわからないユーザーをイライラさせます。)

于 2013-01-01T09:48:16.230 に答える
7

2 つの側面があります。1 つは、使用したい場所でプログラムを停止するかどうかを決定することの利点であり、もう 1 つはexitexit の使用です。マットの答えは最初のものをカバーしています。

2 つ目exitは、通常、C++ では不適切な選択です。その理由は、いくつかのクリーンアップ(関数が登録されatexit、静的ストレージ期間の一部のオブジェクトのデストラクタが含まれることがある)を行うが、それらのすべて(スタック上のオブジェクトのデストラクタ)ではないためです。なし。

于 2013-01-01T10:01:14.000 に答える
3

exit(0)プログラムが正常に終了したことを示し、完全に移植可能です。

exit(1)(通常) 失敗した終了を示します。ただし、その使用法は移植性がありません。

于 2013-01-01T09:42:33.030 に答える
3

またはにmain違いはありません。成功の場合は return/exit 値を使用し、失敗の場合はnonを使用します。exit(1)return 10 0

サブルーチンが別の場所で使用されるライブラリ ルーチンである場合は、何らかのリターン コードまたは例外を使用して制御をメインに戻す必要があります。exitそれ以外の場合は、戻るかどうかはあなたの選択です。

どちらの場合でも、関数が何をするのかを文書化することをお勧めexitreturnますexception

于 2013-01-01T09:46:19.027 に答える
2

それがどこからexit(1)来るかによります。exit(1)これをライブラリから呼び出すのではなく、自分のアプリケーションからのみ呼び出してください。

エラー コードを設定する必要がある場合は、errno(STD C 変数、はい) を設定できます。

より C++ の方法を試したい場合は、詳細なエラー コードとともに例外をスローできます。

于 2013-01-01T09:48:09.227 に答える
1

exit は許容されますが、exit と return ステートメントを使用する場合のメモリの違いに注意することが重要だと思いますが、その exit ではメモリ内の変数が破棄されません。エラーが発生した場合は、終了が正当化されます。それ以外の場合は、return ステートメントに固執します。

于 2013-03-22T00:55:56.827 に答える