exit()関数の使用


99

exit()私の本のプログラムのような関数をいつどのように使用できるか知りたい:

#include<stdio.h>

void main()
{
    int goals;
    printf("enter number of goals scored");
    scanf("%d",&goals);

    if(goals<=5)
        goto sos;
    else
    {
        printf("hehe");
        exit( );
    }
    sos:
    printf("to err is human");
}

実行すると、ERROR:call to undefined function exit()と表示されます。

また、プログラムが実行されているウィンドウを閉じるオプションを作成する方法を知りたいですか?たとえば、いくつかのオプションがあり、そのうちの1つが「メニューを終了する」というメニュー方式のプログラムを作成しました。どうすればプログラムを終了できますか(ウィンドウを閉じるなど)?


8
回答が必要な場合は、コードと質問をフォーマットして、他の人が読めるようにします。そして叫ぶな!

3
コード形式は1つですが、これは不十分に書かれています。あなたはこのような答えを望んでいませんか?
Kobi

53
オイ!ゴトスと終了?私の目!彼らは燃えます!
Kyle

8
私はCエキスパートではないので、問題なく書くことができないので、これについては間違っているかもしれませんが、その本を捨てるように提案できますか?Cでgotoを使用するのは...のような...わかりません。そして、あなたが今すみません、ドアを開ける方法を理解しました* hides.in.the.kitchen * ...
ボビー

8
まあ、gotoはまだCで有効な構文です。文法的には承認されない可能性がありますが、それでも有効です。void main()OTOHは明らかに間違っているexit();間違っているのと同じように、省略#include <stdlib.h>は間違っています。
wildplasser 2013年

回答:



82

exitあなたが持っている必要がありますので、関数は、STDLIBヘッダで宣言されています

#include <stdlib.h>

を使用できるようにするには、プログラムの上部にありますexit

またexit、これは整数の引数を取るため、のように呼び出すことはできません。またはexit()として呼び出すexit(0)必要がありexit(42)ます。0は通常、プログラムが正常に完了したことを意味し、ゼロ以外の値がエラーコードとして使用されます。

事前に定義されたマクロもありますEXIT_SUCCESSEXIT_FAILURE、例えば、exit(EXIT_SUCCESS);


3
+1 exitは、整数引数を取ることを言及するだけでなく、整数引数を取る理由と、一部のコンパイラが明示的なを必要とすることを説明します#include <stdlib.h>
可変性主義

上記の定義済みマクロはコンパイル時に定義されますね。
carloswm85

11

exit(int code);で宣言されstdlib.hているので、

#include <stdlib.h>

また:
-にはパラメーターがありません。パラメーターを指定exit()する必要がありintます。
-この本を燃やすgotoと、(Linuxカーネルハッカー以外のすべての人にとって)どれが悪い、非常に、非常に悪いかを使用します。

編集:
ああ、そして

void main()

悪いことでもあります:

int main(int argc, char *argv[])

ええ、それはあなたが本の完全さのためにgoto btを使うべきではないという本に書かれていますmちょうどあなたに例をあげるだけ...だから本はそれが悪いことではありません!!
Kraken

5
goto時々正しいことです(そしてLinuxカーネルはその多くの例を提供しますが、それを使用できる唯一のコードではありません)。しかし、OPの例は明らかにこれらのケースの1つではないので、そうです、その本は焼かれるべきです:)。
アダム・ローゼンフィールド

11

男の出口を試してください。


ああ、そして:

#include <stdlib.h>

int main(void) {
  /*  ...  */
  if (error_occured) {
    return (EXIT_FAILURE);
  }
  /*  ...  */
  return (EXIT_SUCCESS);
}

具体的には、コンソールから「man 2 exit」を試してください。c docsはかなり詳細です。
ジャスティン

まさにあなたは@Bertrand Marron
Justin

7

exit()関数は、引数なし戻り値の型を持つ関数の型です。stdlibヘッダーファイルで定義されています。

( exit(0) or exit(EXIT_SUCCESS))または (exit(non-zero)またはを使用する必要がありますexit(EXIT_FAILURE) )


4

次の例は、exit()関数の使用法を示しています。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("Start of the program....\n");
    printf("Exiting the program....\n");
    exit(0);
    printf("End of the program....\n");
    return 0;
}

出力

プログラムの開始....プログラムの
終了...


2

#include <stdlib.h>そのヘッダーファイルを含めるには、で行を追加しexit、値を返す必要があるため、に整数を割り当てexit(any_integer)ます。


2

親プロセスに終了コードを返すことに加えて-

UNIXでは、私が除外されていると思う重要な側面は、exit()が最初に(逆順で)呼び出し、atexit()呼び出しによって登録されたすべての関数を呼び出すことです。

詳細はSUSv4を参照してください。


1

UNIXのようなオペレーティングシステムの出口では、システムコールのグループに属しています。システムコールは、ユーザーコード(ユーザーのコード)がカーネルコードを呼び出せるようにする特別な呼び出しです。したがって、exit呼び出しは、OSに制御を返す前に、OS固有のクリーンアップアクションをいくつか実行し、プログラムを終了します。

#include <stdlib.h>

// example 1
int main(int argc, char *argv){
  exit(EXIT_SUCCESS);
}

// example 2
int main(int argc, char *argv){
  return 0;
}

一部のコンパイラは、これらの例の両方から同じオペコードを提供しますが、そうしないコンパイラもあります。たとえば、最初の関数のオペコードには、他の関数と同様に、2番目の例に含まれるスタック配置オペコードの種類は含まれません。両方の例をコンパイルして逆アセンブルすると、違いがわかります。

コードの任意の部分からexitを使用して、プロセスが終了することを確認できます。整数パラメータを含めることを忘れないでください。


-2

ヘッダファイルを書く#include<process.h>と置き換えるexit();exit(0);。これは間違いなくTurbo Cで機能します。他のコンパイラについては知りません。


1
<process.h> `は非標準です。exit関数がで宣言されています<stdlib.h>
キーストンプソン

<process.h>はこの問題を解決しません。尋ねられる質問を理解しましたか?
CuriousMind 2016

-3

悪いプログラミングの習慣。goto関数の使用は、Cプログラミングではまったく問題ありません。関数を使用するために
記述#include <iostream.h>することにより、ヘッダーファイルstdlib.hもインクルードしexit()ます。また、exit()関数は整数の引数を取ることに注意してください。exit(0)プログラムが正常に完了した場合に使用しexit(-1)ます。または、プログラムにエラーがある場合、引数としてゼロ以外の値を指定して関数を終了します。


1
<iostream.h>C ++に固有であり<stdlib.h>、実際に必要なヘッダーであるとは関係ありません。唯一のポータブル引数exit関数があり0EXIT_SUCCESSEXIT_FAILURE。障害を示すためにゼロ以外の値を使用することは、UNIXライクなシステム(およびおそらく他のシステム)に固有です。移植可能なコードではこれに依存しないでください。
キーストンプソン

-4

stdlib.hヘッダーに含め、abort();プログラムを終了する任意の場所で呼び出します。このような:

switch(varName)
{
    case 1: 
     blah blah;
    case 2:
     blah blah;
    case 3:
     abort();
}

ユーザーがスイッチを入力すると、これが受け入れられ、abort関数を呼び出すケース3に渡されます。Enterキーを押すとすぐに画面を終了します。


6
abortここで呼び出すのは適切ではありませんatexit。ハンドラを呼び出したり、開いているファイルのバッファをフラッシュしたりしません。アサーションの失敗など、プログラムの異常終了にのみ使用してください。通常のプログラム終了にexitは、を使用する必要があります。
アダム・ローゼンフィールド、2011年

-6

stdlibとiostreamの代わりにprocess.hを使用してください... 100%動作します。


4
process.hが何であるかわかりません。それは確かに標準のCではなく、それを提供しないシステムでは動作しません。<iostream>ヘッダは、C ++に特異的です。質問はC.についてです
キース・トンプソン

1
これはYahoo!ではありません。回答、それはスタックオーバーフローです。答える場合は、少なくとも最初にテストする必要があります!
wizzwizz4
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.