C言語 EXIT_FAILURE と EXIT_SUCCESS の違い

2024-04-02

C言語における EXIT_FAILURE の詳細解説

概要

  • ヘッダファイル: stdlib.h
  • 定義: #define EXIT_FAILURE 1
  • 用途: プログラムの異常終了を報告
  • 返値: 1

EXIT_FAILURE の使い方

exit() 関数の引数として EXIT_FAILURE を渡すことで、プログラムが異常終了したことをオペレーティングシステムに通知できます。

#include <stdlib.h>

int main() {
  // エラー処理...

  // エラーが発生した場合
  exit(EXIT_FAILURE);

  return 0; // 正常終了
}

上記コードでは、エラー処理 の後にエラーが発生した場合、exit(EXIT_FAILURE) を呼び出してプログラムを異常終了させます。

EXIT_FAILURE と EXIT_SUCCESS

EXIT_FAILURE と対になるマクロとして EXIT_SUCCESS が存在します。こちらはプログラムが正常終了したことを示すために使用されます。

#include <stdlib.h>

int main() {
  // 処理...

  return EXIT_SUCCESS; // 正常終了
}

上記コードでは、処理 が完了した後、EXIT_SUCCESS を返してプログラムを正常終了させます。

  • EXIT_FAILURE はマクロなので、直接数値 1 を渡しても同じ意味になります。
  • 多くの場合、EXIT_FAILURE はエラー処理の最後に使用されます。
  • プログラムが異常終了した場合、オペレーティングシステムはシェルに終了コード 1 を返します。

EXIT_FAILURE は、C言語でプログラムの異常終了を報告するために使用されるマクロです。プログラムが正常終了した場合は EXIT_SUCCESS を使用します。



C言語における EXIT_FAILURE のサンプルコード

ファイルオープンエラー

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

int main() {
  FILE *fp;

  // ファイルを開こうとする
  fp = fopen("nonexistent_file.txt", "r");

  // ファイルオープンに失敗した場合
  if (fp == NULL) {
    perror("fopen() failed");
    exit(EXIT_FAILURE);
  }

  // ファイルオープン成功時の処理

  fclose(fp);

  return EXIT_SUCCESS;
}

メモリ確保エラー

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

int main() {
  int *ptr;

  // メモリを確保しようとする
  ptr = malloc(sizeof(int) * 1000000);

  // メモリ確保に失敗した場合
  if (ptr == NULL) {
    fprintf(stderr, "malloc() failed\n");
    exit(EXIT_FAILURE);
  }

  // メモリ確保成功時の処理

  free(ptr);

  return EXIT_SUCCESS;
}

計算エラー

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

int main() {
  int a = 10, b = 0;

  // 0で割ろうとする
  int c = a / b;

  // 0で割った場合
  if (c == 0) {
    fprintf(stderr, "Division by zero\n");
    exit(EXIT_FAILURE);
  }

  // 0で割らなかった場合

  return EXIT_SUCCESS;
}

シグナル処理

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

void signal_handler(int signum) {
  fprintf(stderr, "Caught signal %d\n", signum);
  exit(EXIT_FAILURE);
}

int main() {
  // SIGINT シグナルハンドラを設定
  signal(SIGINT, signal_handler);

  // 無限ループ
  while (1) {
    // 処理...
  }

  return EXIT_SUCCESS;
}


C言語でプログラムの異常終了を報告する他の方法

エラーコードを返す

main() 関数から非ゼロの値を返すことで、プログラムが異常終了したことを報告できます。

int main() {
  // エラー処理...

  // エラーが発生した場合
  return 1; // エラーコード

  return 0; // 正常終了
}

この方法は、EXIT_FAILURE よりも詳細なエラー情報をオペレーティングシステムに伝えることができます。

stderr にエラーメッセージを出力することで、プログラムが異常終了したことをユーザーに通知できます。

int main() {
  // エラー処理...

  // エラーが発生した場合
  fprintf(stderr, "エラーメッセージ\n");

  return 1; // エラーコード
}

この方法は、ユーザーに何が起こったのかを伝えるのに役立ちます。

アサートを使用して、プログラムの状態が期待通りであることを確認できます。アサートが失敗すると、プログラムは異常終了します。

#include <assert.h>

int main() {
  int x = 10;

  // アサートを使用して、x が 10 であることを確認
  assert(x == 10);

  // x が 10 以外の場合、プログラムは異常終了
  x = 20;

  return 0; // 正常終了
}

この方法は、プログラムのバグを見つけるのに役立ちます。

ログファイルを使用する

ログファイルにエラー情報を記録することで、プログラムが異常終了した原因を調査することができます。

#include <stdio.h>

int main() {
  // エラー処理...

  // エラーが発生した場合
  FILE *fp = fopen("error.log", "a");
  fprintf(fp, "エラーメッセージ\n");
  fclose(fp);

  return 1; // エラーコード
}

この方法は、プログラムがどのように実行されたかを追跡するのに役立ちます。

EXIT_FAILURE は、C言語でプログラムの異常終了を報告する最も簡単な方法です。しかし、他の方法も状況に応じて役立ちます。




C言語とFortran:メモリ管理、処理速度、並列処理の比較

C言語とFortranには、多くの共通するキーワードがあります。以下に、いくつかの例を示します。制御構文: if else for while do endifelseforwhiledoendデータ型: integer real character logical



typeof_unqual の代替方法:型キャスト、マクロ、C++ の std::decay

C言語における typeof_unqual キーワードは、オペランドの型を 修飾子なしの型名 で取得するために使用されます。これは、型推論やジェネリックプログラミングなどの高度なプログラミング技法を可能にする強力なツールです。typeof_unqual の役割


C言語における extern キーワードのサンプルコード

extern の役割:オブジェクトの宣言: extern は、オブジェクトの存在を宣言しますが、その定義は別のソースファイルで行います。スコープの制御: extern は、オブジェクトのスコープをファイル全体に拡張します。重複定義の防止: extern は、異なるソースファイルでオブジェクトを重複定義することを防ぎます。


C言語 switch-case文の使い方:数値、文字列で複数条件分岐

1 変数switch文で評価する変数です。整数型、文字型、enum型など、様々な型が使用できます。2 case各条件を表します。caseの後に評価する値を記述します。3 処理各条件に合致した場合に実行される処理を記述します。複数の文を記述したい場合は、{ }で囲みます。


C言語プログラマーなら知っておきたい!暗黙の型変換の落とし穴と回避策

C言語における主な暗黙の型変換は以下の通りです。昇格変換: 小さい型の値を、より大きな型の値に変換します。例えば、char 型の値を int 型に変換します。降格変換: 大きい型の値を、小さい型の値に変換します。ただし、データ損失の可能性があるため、注意が必要です。例えば、int 型の値を char 型に変換する場合、値の一部が切り捨てられます。



C言語 do-while ループ vs. while ループ: どっちを使うべき?

do-while ループ は、以下の要素で構成されています。do:処理内容を記述するブロック処理内容: ループ内で実行される処理while: ループ継続の条件式do ブロック内の処理を実行します。while 条件式を評価します。条件式が true の場合、1. に戻り処理を繰り返します。


FE_TONEAREST を使って浮動小数点数を丸める

以下の例では、FE_TONEAREST を使用して、3.1415926535 を小数点以下2桁に丸めます。このコードを実行すると、以下の出力が得られます。上記のように、FE_TONEAREST を使用すると、3.1415926535 は 0.5 に近い 14 に丸められます。


複数の例外設定をまとめて取得! C言語 Numerics ライブラリの fegetexceptflag 関数

fegetexceptflagは、以下の情報を取得します。浮動小数点例外が発生した際に、プログラムが終了するかどうか浮動小数点例外が発生した際に、プログラムがSIGFPEシグナルを受け取るかfegetexceptflagは以下の引数を受け取ります。


C言語でワイド文字列メモリを初期化:wmemset関数徹底解説

機能: ワイド文字列のメモリ領域を指定した値で初期化ヘッダーファイル: <cwchar>プロトタイプ:引数: ptr: 初期化するワイド文字列へのポインタ wc: 設定するワイド文字 num: 初期化するワイド文字数引数:ptr: 初期化するワイド文字列へのポインタ


【初心者向け】C言語「Strings」における strtoll 関数の詳細解説とサンプルコード集

strtoll 関数は、C言語の標準ライブラリ stdlib. h に含まれる関数で、文字列を指定された基数に基づいて 64ビット整数 に変換します。これは、strtol 関数の機能を拡張したもので、より大きな整数値の処理に対応しています。