- ベストアンサー
関数をこえてプログラムを強制終了させる方法
main関数以外の関数からmainのreturnに移動して終了するにはどうすればよろしいのでしょうか?。main関数以外の関数からgotoでreturnの前まで移動しようとしたら関数を飛び越えて移動できませんとエラーが起こりました。関数をこえて強制終了させる方法を知っている方お願いします。教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
longjmp()という方法があります。 でも、絶対使わないほうが良いと思います。 例文を載せます。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> #include <setjmp.h> jmp_buf env; void ugly(void) { printf("enter ugly()\n"); printf(" Press [CR]"); getchar(); longjmp(env, -1); printf("この文はugly()の中で実行されることはありません。\n"); } int main(void) { if (setjmp(env) == 0) { printf("call ugly()\n"); printf(" Press [CR]"); getchar(); ugly(); printf("この文はmain()の中で実行されることはありません。\n"); } else { printf("ugly()からlongjmp()で戻りました。\n"); } return 0; }
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
> main関数以外の関数からmainのreturnに移動して終了するにはどうすればよろしいのでしょうか? exitやabortでは、mainのreturnに移動するわけではないので、使えませんね。 > main関数以外の関数からgotoでreturnの前まで移動しようとしたら関数を飛び越えて移動できませんとエラーが起こりました。関数をこえて強制終了させる方法を知っている方お願いします。教えてください。 C++であれば、例外を送出するのが普通のやり方ですが、この方法ではmainに戻る前にcatchされてしまうと、目的を果たせません。したがって確実な方法はないと思います。 Cであれば、setjmp/longjmpの組を使えば実現可能です。 #include <setjmp.h> jmp_buf env; void func(void) { longjmp(env, 1); } int main(void) { if (setjmp(env) == 0) { func(); } return 0; } のようにすれば、関数の枠組みを飛び越えることができます。 ただ、今回初めてこの方法を知ったのであれば、使わない方が無難です。使うなら、そのメリット・デメリットのほか、特性を十分に理解してからにしてください。
- YamaYoshi
- ベストアンサー率29% (91/313)
#1です。 書き忘れたのでひとつ。 gotoはやむ終えない場合を除き、使わないほうがいいですよ。 大きくなっても、コードで書いたほうが読みやすい。 読みやすいということは複数人での作業が容易になります。
- chie65536
- ベストアンサー率41% (2512/6032)
exit()関数かabort()関数を使用。 または、mainで例外をキャプチャーし、抜けたい場所で例外を発生させる。
- YamaYoshi
- ベストアンサー率29% (91/313)
#include <stdlib.h> exit(0);// 正常終了なら0、異常なら1 http://www9.plala.or.jp/sgwr-t/c/sec07.html#s7-4 ここら辺を参照するとよいかも。