性格いい人が優勝

main関数以外の関数からmainのreturnに移動して終了するにはどうすればよろしいのでしょうか?。main関数以外の関数からgotoでreturnの前まで移動しようとしたら関数を飛び越えて移動できませんとエラーが起こりました。関数をこえて強制終了させる方法を知っている方お願いします。教えてください。

A 回答 (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;
}
    • good
    • 0

> 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;
}

のようにすれば、関数の枠組みを飛び越えることができます。
ただ、今回初めてこの方法を知ったのであれば、使わない方が無難です。使うなら、そのメリット・デメリットのほか、特性を十分に理解してからにしてください。
    • good
    • 0

#1です。



書き忘れたのでひとつ。

gotoはやむ終えない場合を除き、使わないほうがいいですよ。

大きくなっても、コードで書いたほうが読みやすい。
読みやすいということは複数人での作業が容易になります。
    • good
    • 0

exit()関数かabort()関数を使用。


または、mainで例外をキャプチャーし、抜けたい場所で例外を発生させる。
    • good
    • 0

#include <stdlib.h>



exit(0);// 正常終了なら0、異常なら1

http://www9.plala.or.jp/sgwr-t/c/sec07.html#s7-4
ここら辺を参照するとよいかも。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!