2013-01-01 24 views
18

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

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

また、私のプログラムには、ファイル内のデータを解析する別の機能があります。この関数はmain()によって呼び出されます。この関数がデータ内でエラーを検出した場合は、エラーメッセージを出力した後にプログラムを停止します。このような状況では、私の解析関数内でexit()関数を使用することは許容されますか?私は、main()関数に制御を戻さずに関数が自分のプログラムを終了できるようにするのは非常にきれいではないようだから、この質問をしています。 (私はこの質問がかなり明白なように思えば謝ります。私はC++とプログラミング全般に新しいです)。

+0

質問が分かりません。プログラムを正常に終了させるつもりですか?もしそうなら、私はここで見ることができる何も間違っていないので。 – Rapptz

答えて

3

exit(0)

exit(1)は(通常は)un​​sucessful終了を示しますが、それは、完全にポータブルで成功したプログラム終了&を示しています。しかし、その使い方は移植性がありません。

+0

その使用法が移植可能でない場合の例を教えてください。 – Rapptz

+0

@Rapptz:これは[この回答](http://stackoverflow.com/a/8696712/78845)の最後に説明されています。 – Johnsyweb

+0

@Johnsywebありがとうございます。私は 'return 0'と' return n'の違いをn!= 0で知っていましたが、 'std :: exit'にどのように適用されたのかは不明でしたので、今私は知っていると思います。 – Rapptz

1

mainexit(1)またはreturn 1には違いがありません。成功の場合は0、失敗の場合は 0の戻り値/終了値を使用します。

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

いずれの場合でも、機能の内容を文書化すると、exit,returnコードまたはexceptionになることをお勧めします。

1

それはexit(1)がどこに由来するかによって異なります。このexit(1)は、自分のアプリケーションからのみライブラリから呼び出すべきではありません。

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

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

14

関数からの呼び出しexitは、明確な振る舞いを持っているという意味で「悪い」ものではありません。基本的に間違ったことはありません。

しかし、たとえばライブラリで終わる可能性のある関数を書く場合は、exitから呼び出してください。一般的に悪い習慣があります。呼び出し側のコードにエラーを通知するほうが値または例外)を呼び出し、呼び出しコードが何をすべきかを決定させる。例えば、quit_if_file_not_foundという関数を書いている場合など、ユーザーが終了を期待している場合など)

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

(そして、上記のようにエラーメッセージを出力したりログを記録したりしないでください。遭遇したコードの問題を修正する方法がわからない、不満を感じるユーザーに向いています)

+0

私の関数の戻り値の型はvoidです..エラーを通知するものは返せません。 – mahela007

+2

これを変更したり、 "outパラメータ"を使用したり、例外を使用したりする必要があります。失敗する可能性があり、エラーを通知する方法を持たない関数は、設計上の誤りです。 – Mat

6

2つの側面があります。一つは、あなたが使用したい場所でプログラムを停止することを決定することの関心ですexit、もう一つは出口の使用です。 Mat's answerは最初をカバーします。

2番目の場合、exitは通常、C++では悪い選択です。その理由は、いくつかのクリーンアップ(atexitで登録された関数であり、時には静的ストレージ期間のオブジェクトのデストラクタも含む)ですが、それらのすべて(スタック上のオブジェクトのデストラクタ)ではなく、私の経験では、またはなし。

1

終了は許容されますが、exitを使用するとメモリ内の変数を破棄しないreturn文を使用した場合のメモリの違いに注意することが重要です。何らかのエラーがある場合、exitは正当化されます。それ以外の場合、私はreturn文に固執します。

関連する問題