問題① 標準出力へ書き出す内容がバッファに残されている状態で、 main関数の終了、exit関数による終了、abort関数による終了がそれぞれどのような結果になるか確認してください。
たとえば、次のようなプログラムを書いて確かめられます。
#include <stdio.h>
#include <stdlib.h>
#define EXIT_TYPE 0 // プログラムの終わり方
// 0: return
// 1: exit関数
// 2: abort関数
int main(void)
{
static char stdout_buf[BUFSIZ];
if (setvbuf(stdout, stdout_buf, _IOFBF, sizeof(stdout_buf)) != 0) {
("stdout のバッファリングを変更できませんでした。\n", stderr);
fputs(EXIT_FAILURE);
exit}
("test");
printf
#if EXIT_TYPE == 0
return 0;
#elif EXIT_TYPE == 1
(EXIT_SUCCESS);
exit#elif EXIT_TYPE == 2
();
abort#endif
}
実行結果(return文の場合):
test
実行結果(exit関数の場合):
test
実行結果(abort関数の場合):
main関数から return で終了する場合と、exit関数で終了する場合には、バッファの内容はフラッシュされますから、きちんと出力されます。
abort関数で終了する場合は、バッファの内容がフラッシュされる保証はありません。もしかすると、きちんと出力されることもあるかもしれませんが、試した環境では出力されませんでした。もし、abort関数を使うのなら、このことを考慮して、重要な情報を fflush関数で確実に内容を出力させるようにします。
assertマクロも abort関数を呼び出してプログラムを終了させますが、assert はメッセージを表示させることを保証しているので、特に心配する必要はありません。
assertマクロは、標準エラーにメッセージを出力します。標準エラーは多くの場合、バッファリング無しになっているので、普通はバッファに取り残される問題は起こらないはずです。
()
の前後の空白の空け方)(
の直後、)
の直前に空白を入れない)全面的に文章を見直し、修正を行った。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |