ID非公開

2020/7/3 13:55

55回答

C言語、C++についての質問です。 ある関数のある場所から、他の関数の任意の行へジャンプして実行するようなプログラムを書きたいです。 やりたいこととしてはgo to文とほぼ同じなのです

C言語、C++についての質問です。 ある関数のある場所から、他の関数の任意の行へジャンプして実行するようなプログラムを書きたいです。 やりたいこととしてはgo to文とほぼ同じなのです が、これは関数をまたいで使えませんでしたので、この度質問させていただきました。 お恥ずかしながら初学者ですので、優しく教えてくださると大変助かります。 先達諸兄姉のご回答、お待ちしております。

ベストアンサー

0

C言語は実行時はネストした関数がスタックに積み重なった構造になっている為、 そういう関数を無視した移動がなされると困った事になります。 ジャンプ先を関数の一部では無く、別関数としてくくりだした上で、 双方から呼ぶようにしてください。 関数A{ 1 2←ここから 3 } 関数B{ x y←ここに飛びたい z } ↓ 関数A{ 1 2 関数C()←ここから 3 } 関数B{ x 関数C() } 関数C{ ←ここに飛ぶ y z }

ThanksImg質問者からのお礼コメント

御三方ともご教示ありがとうございました! どれも私にとって大変役立つ情報で、とても参考になりました。 本当なら全員にベストアンサーを差し上げたいところなのですが、今回はいち早く回答をくださった方に差し上げようと思います。 改めて、ご回答をいただき本当にありがとうございました!

お礼日時:7/5 1:58

その他の回答(4件)

0

hjk********さんが述べているとおり、setjmp と longjmpが該当機能です。 C言語を含む高級言語がそういうgoto文の禁止を是としていると思ってください。 機械語や初期のBASIC言語が関数という概念を持たず一個の大きなプログラムとして動いていました。 ただこれではソフトが大きくなると利便性の問題から不要な機能として排除してきた経緯があります。関数って実質、最小呼び出し単位というのが大筋の発想です。 C言語の場合は関数の構造そのものがつまりそういうgoto文の使い方を否定しています。 関数が呼ばれたときにローカル変数用のメモリを自動的に割り振るという動的な処理をしています。ですから自分を呼び出した親、親の親関数へのjumpは可能ですが、まだ一回も呼ばれていない関数などにはおそらくjumpできないなどの制約があるはずです。

1

setjmp と longjmp ですね。 しかし、よっぽどの上級者でないと、使うべきではないです。 間違いなく、初学者の方が使うべきではありません。 やりたいことに対して、別の解決案があるはずです。

1人がナイス!しています

0

そういうことはできません。 そういうことをしないでも済むような作りを考えてください。