こんにちは~ やってやるぞーです!
今回は、
皆さんがGOTO文を使ったことがあるのか、
その場合どのように使ったのか、
などなど教えていただきたくトピックを立てました。
よろしければGOTO文の使い道についての皆さんのご意見を教えていただきたいので、
どんどんコメントお願いします!
ついでですが、作品お披露目掲示板にて、
3D迷路ゲーム「大脱出」を公開しております。
よろしければ、そちらの方も拝見していただきたいと思います。
それではまた~
GOTO文の使い道について
Re: GOTO文の使い道について
こんにちは。
私は確保したメモリの解放し忘れを防ぐために使用します。
こんな感じに関数内でなんらかの不具合が発生した際にgotoを使ってエラー処理をします。
これでメモリリークが発生しづらくなります。
ただC++が使えるならばスマートポインタを用いますし、Cしか使えなくても、もう少し工夫しますがw
私は確保したメモリの解放し忘れを防ぐために使用します。
char *p1 = NULL; // グローバル
char *p2 = NULL;
int example() {
p1 = malloc( 512 ); // メモリ確保
if( NULL == p1 ) {
return -1; // エラー処理
}
p2 = malloc( 256 ); // メモリ確保
if( NULL == p2 ) {
free( p1 );
return -1; // エラー処理
}
if( -1 == func1() ) {
/// func1関数が失敗したら
goto error; // ラベル"error"に飛ぶ
}
if( -1 == func2() ) {
/// func2関数が失敗したら
goto error; // ラベル"error"に飛ぶ
}
return 0;
// ラベル "error"
error:
free( p1 ); // メモリを開放
free( p2 );
return -1; // -1を返す
}
これでメモリリークが発生しづらくなります。
ただC++が使えるならばスマートポインタを用いますし、Cしか使えなくても、もう少し工夫しますがw
Re: GOTO文の使い道について
shino0526yさん 貴重なご意見、ありがとうございます!
何らかの理由で処理を飛ばしたい時に有効ということでしょうか?
ですが見づらくなるので、メモリ破棄には別の方法を使う方が良さそうですね。
ありがとうございます。
他の使い道も何かあればどんどん教えてください!
それではまた~
何らかの理由で処理を飛ばしたい時に有効ということでしょうか?
ですが見づらくなるので、メモリ破棄には別の方法を使う方が良さそうですね。
ありがとうございます。
他の使い道も何かあればどんどん教えてください!
それではまた~
Re: GOTO文の使い道について
デストラクタの実行に相当するようなことをまとめて行うために,リソース解放処理を関数中にまとめておいて,returnの代わりにそこにgotoでジャンプさせて解放処理を行う,というものだと思います。やってやるぞー さんが書きました: 何らかの理由で処理を飛ばしたい時に有効ということでしょうか?
ですが見づらくなるので、メモリ破棄には別の方法を使う方が良さそうですね。
一般的なgotoの使い方の一つですね。
e.g.) MEM12-C. リソースの使用および解放の最中に発生するエラーが原因で関数を終了する場合に、Goto 連鎖の使用を検討する - JPCERT.CC
あとは,多重ループから一気に外に出るために使うくらいが現在利用価値のある使い方かと思います。
ただ,多重ループから出るために使う場合はループを関数化することで代替できるため,gotoを使わない方がよいことも多いです。
Re: GOTO文の使い道について
ちなみに、D言語では、Java同様にbreak文とcontinue文にラベルを付けられるようになって、goto文はほとんど出番がなくなったけど、
D言語は「現実的なプログラミング」を謳っているので、Javaでは面倒だった部分をD言語では、goto文で楽に処理できるようになってます。
D言語は「現実的なプログラミング」を謳っているので、Javaでは面倒だった部分をD言語では、goto文で楽に処理できるようになってます。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: GOTO文の使い道について
> ですが見づらくなるので、メモリ破棄には別の方法を使う方が良さそうですね。
そうですか?
リソースのクローズ等の後始末処理を関数の最後尾に書いて飛ばす処理はよく見ると思います。
逆にそれ以外の利用価値が私には見出せません。
try-catchする等代替手段はいくらでもあるので、goto文が必須な状況はほとんどないかと思います。
そうですか?
リソースのクローズ等の後始末処理を関数の最後尾に書いて飛ばす処理はよく見ると思います。
逆にそれ以外の利用価値が私には見出せません。
try-catchする等代替手段はいくらでもあるので、goto文が必須な状況はほとんどないかと思います。
Re: GOTO文の使い道について
オープンソースの有名どころを検索してみてはいかがでしょうか。例えば gcc の場合これだけ見つかります。前半はほとんどテストコードですけど。
https://github.com/gcc-mirror/gcc/searc ... goto&type=
他に思いつくのはLinux kernelとかchromiumでしょうかね。いい勉強になると思いますよ。
https://github.com/gcc-mirror/gcc/searc ... goto&type=
他に思いつくのはLinux kernelとかchromiumでしょうかね。いい勉強になると思いますよ。
Re: GOTO文の使い道について
皆さん ご回答ありがとうございます!
↑のコードに関しては、関数のデストラクタという事でしょうか?
他の方法に関しては、別の方法で代用できる場合がほとんどでgoto文の出番はなさそうですね。
YuOさん、たなかさん ハイパーリンクを貼っていただきありがとうございます。
他の方もありがとうございます。
他の使い道も何かあればどんどん教えてください!
それではまた~
↑のコードに関しては、関数のデストラクタという事でしょうか?
他の方法に関しては、別の方法で代用できる場合がほとんどでgoto文の出番はなさそうですね。
YuOさん、たなかさん ハイパーリンクを貼っていただきありがとうございます。
他の方もありがとうございます。
他の使い道も何かあればどんどん教えてください!
それではまた~
Re: GOTO文の使い道について
無条件分岐なら他の人が言うようにエラー処理なんかで使いますけど、色々ある無条件分岐のうちgoto文はあんまり使わないです。使いにくいからです。関数内でしか飛べないんじゃ話にならないのでだいたいlongjmpです。それと、みんな普通に使ってる途中returnは要するに関数末尾への無条件分岐ですし、breakはループの終了直後への無条件分岐で、ただスペルがgotoではないというだけのものです。