アプリ版:「スタンプのみでお礼する」機能のリリースについて

C で、関数の中から、別の関数の中の特定のラベルにジャンプすることはできますか。

A 回答 (3件)

一応、 setjmp , longjmp というのはありますが。


gotoほど自由に飛べるわけではありません。

そんな変則的なジャンプなどしないで済むように作るのがよいかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
こういう関数が用意されていたのですね。
関数a の中で setjmp を実行し、a から抜け出た後、別の関数の中で longjmp を実行すると a の setjmp が実行されるという仕様だと都合がいいのですが、それはできないようですね。

お礼日時:2016/03/09 00:23

使ったことはないけど GCC には拡張機能として


・単項&& 演算子: &&label でlabel のアドレスを取り出す (結果の型は void *)
・void *型の値 p に対してそのアドレスにジャンプする goto *p;
がある (https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Lab … 参照) ので, この 2つを組み合わせれば (完全ではないにしろ) 似たような機能は実現できるんじゃないかな.

ドキュメントにもあるように非常に危険な行為だから使うべきじゃないだろうけど.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
別の関数の中へジャンプというのができるのでしょうかね。

お礼日時:2016/03/10 18:24

別の関数のラベルを指定して直接飛ぶことは不可能です (そもそも「別の関数のラベル」が指定できない) が, 別の関数のラベルのアドレスがわかっていればそこに飛ぶことはできます. 例えば


#include <stdio.h>

void *foo(void)
{
printf("before label\n");
label:
printf("after label\n");
return &&label;
}

void bar(void *ptr)
{
printf("in bar\n");
goto *ptr;
}

int main(void)
{
void *p = foo();
bar(p);
return 0;
}
なんてプログラムを GCC でコンパイル&実行してみると (警告は出るもののいちおうコンパイルできます) わかると思います.
    • good
    • 0
この回答へのお礼

なるほどね。
ありがとうございます。

お礼日時:2016/03/11 06:50

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