return vs exit()メイン()
-
19-08-2019 - |
質問
どちらを使うべき exit()
ただ return
諸表 main()
?個人的にいっそう引き立てを return
諸表に感じてしまっているためで読みたくなるその他の機能のフローの制御だけでなく、いくつかについて触れたいと思い、コードがスムーズ(思).もしたい場合は、refactor main()
機能を有 return
ように思えるのでよく exit()
.
は exit()
何も特別なことを return
ん?
解決
実際には違いがありますが 、微妙です。 C ++にはより多くの影響がありますが、違いは重要です。
return
でmain()
を呼び出すと、ローカルスコープのオブジェクトのデストラクターが呼び出されます。 exit()
を呼び出すと、ローカルスコープのオブジェクトに対してデストラクタは呼び出されません!それを読み直します。 static
戻らない。つまり、一度呼び出すと、<!> quot; no backsies。<!> quot;その関数で作成したオブジェクトは破棄されません。多くの場合、これには意味がありませんが、ファイルを閉じるような場合もあります(確実にすべてのデータをディスクにフラッシュしますか?)。
abort()
を呼び出しても、<=>オブジェクトはクリーンアップされることに注意してください。最後に、<=>を使用した場合、オブジェクトは破棄されないことに注意してください。つまり、グローバルオブジェクト、静的オブジェクト、およびローカルオブジェクトにはデストラクタが呼び出されません。
リターンよりも出口を優先する場合は注意してください。
http://groups.google.com/group/gnu。 gcc.help/msg/8348c50030cfd15a
他のヒント
別の違い:
exit
は標準ライブラリです
機能するため、含める必要があります
ヘッダーと標準とのリンク
としょうかん。 (C ++で)説明するために、
これは有効なプログラムです:
int main() { return 0; }
ただし、main
を使用するにはincludeが必要です:
#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }
さらに、これは追加の仮定を追加します。return
から<=>を呼び出すと、ゼロを返すのと同じ副作用があります。他の人が指摘したように、これはあなたがビルドしている実行可能ファイルの種類(つまり、<=>を呼び出している人)に依存します。 Cランタイムを使用するアプリをコーディングしていますか? Mayaプラグイン? Windowsサービス?ドライバー?各ケースでは、<=>が<=>と同等であるかどうかを確認するための調査が必要になります。 <=>本当に意味する <=>のときに<=>を使用すると、コードが混乱しやすくなります。 OTOH、あなたが本当に を意味する場合、<=>、それを必ず使用します。
が少なくとも一つの理由。 exit
:合がつかない場合は、 atexit
ハンドラを参照して自動保存時間データ main
, 、またはご利用いただいていたお客様 setvbuf
または setbuf
に割り当てる大規模データベースの整備の流れを自動収納時間のバッファー main
, その帰国 main
出ませんが、呼び出し exit
ことがあるかもしれません。
他の潜在的利用(通常予約の玩具プログラムしかし)終了プログラムからの再帰的な main
.
return
の標準プロトタイプは、main()
を返すと言っているため、常にint
を使用します。
とは言っても、標準の一部のバージョンではmain
特別な処理を行い、明示的なfoo()
ステートメントがない場合は0を返すと想定しています。次のコードを考えます:
int foo() {}
int main(int argc, char *argv[]) {}
G ++は<=>に対してのみ警告を生成し、<=>からの欠落した戻りを無視します:
% g++ -Wall -c foo.cc
foo.cc: In function ‘int foo()’:
foo.cc:1: warning: control reaches end of non-void function
I 強く 第二のコメントR.使用に関口()することを回避するために、自動保存 main()
再生前に実際にプログラムが行っています。A return X;
決 main()
は正確に相当する電話 exit(X);
, らの動態保存 main()
異なる場合 main()
を返しますが、それがゼロの場合の呼び出し exit()
されます。
さらに、CやCのように語る return
決強くのヒントのリーダーが実行の呼び出し機能は、この継続実行する通常の技術の真の場合はカウントCの起動時にルーチンと呼ばれるお main()
機能など す 平均するというのです。
したい場合には終了プログラム内のその他の機能を除く main()
す 必要 電話 exit()
.その際一貫して main()
としてもおなコードも読みやすくするためのものであり、や誰でも再因子にコード;すなわちコードからコピーされた main()
その他の機能のなぞが偶然 return
算 すべ してい exit()
ます。
なので、組み合わせにおいて改善すべきポイントと結論されるとのこと 悪い癖, 以Cの利用 return
算のプログラム main()
.
exit()は 'return'がしない特別なことをしますか?
一般的でないプラットフォーム用の一部のコンパイラーでは、exit()
は引数をプログラムの終了値に変換しますが、main()
からの戻り値は変換せずにホスト環境に直接値を渡すだけです。
これらの場合、標準は同一の動作を必要とします(具体的には、int
からEXIT_SUCCESS
と互換性のあるものを返すことは、その値でEXIT_FAILURE
を呼び出すことと同等であると言われます)。問題は、OSごとに終了値を解釈するための規則が異なることです。多くの(多くの!)システムでは、0は成功を意味し、その他は失敗を意味します。しかし、VMSでは、奇数の値は成功を意味し、偶数の値は失敗を意味します。 exit(0)
から0を返した場合、VMSユーザーにはアクセス違反に関する厄介なメッセージが表示されます。実際にはアクセス違反はありませんでした。これは、エラーコード0に関連付けられた標準メッセージでした。
次にANSIが登場し、exit(EXIT_SUCCESS)
に渡すことができる引数として0
と<=>を祝福しました。標準では、<=>は<=>と同じように動作する必要があるため、ほとんどの実装では<=>を<=>に定義しています。
したがって、たまたま値0を持つ failure コードを返す標準的な方法を残していないため、標準ではVMSにバインドされます。
したがって、1990年代初期のVAX / VMS Cコンパイラは<=>からの戻り値を解釈せず、ホスト環境に値を返しました。しかし、<=>を使用した場合、標準が要求することを行います。<=>(または<=>)を成功コードに変換し、<=>を一般的な失敗コードに変換します。 <=>を使用するには、 を使用して<=>に渡しましたが、<=>から返すことはできませんでした。そのコンパイラのより新しいバージョンがその動作を維持したかどうかはわかりません。
このように見えるために使用されるポータブルCプログラム:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
脇:正しく思い出せば、終了値のVMS規則は奇数/偶数よりも微妙です。実際には、下位3ビットのようなものを使用して、重大度レベルをエンコードします。ただし、一般的に言えば、奇数の重大度レベルは成功またはその他の情報を示し、偶数の重大度レベルはエラーを示しました。
Cでmain
から戻ることは、同じ値でexit
を呼び出すこととまったく同じです。
メイン関数の戻り値の型がintと互換性のある型である場合 、メイン関数への最初の呼び出しからの戻りは次と同等です メインによって返された値で出口関数を呼び出す 引数として機能; 11)に到達する} main関数は、値0を返します。戻りタイプが intと互換性がありません。終了ステータスは ホスト環境は指定されていません。
他の回答で述べたように、C ++のルールは少し異なります。
実際には、exit(0)
とreturn(0)
にはmain
<!>#8211; <!> nbsp; exit
関数が複数回呼び出された場合に違いがあります。
次のプログラム
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc == 0)
return(0);
printf("%d", main(argc - 1, argv));
}
別のユーザーとして実行
./program 0 0 0 0
次の出力になります:
00000
ただし、これ:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc == 0)
exit(0);
printf("%d", main(argc - 1, argv));
}
引数に関係なく何も出力しません。
誰もあなたの<=>を明示的に呼び出すことはないと確信している場合、一般的に技術的に大きな違いはありませんが、より明確なコードを維持することは<=>の方がはるかに良いでしょう。何らかの理由で<=> <!>#8211を呼び出したい場合;ニーズに合わせて調整する必要があります。
Cについて話す。