goto
が便利な場合の一つに、下のようなコードがある。
initialize_a();
if (error) goto exit_a;
initialize_b();
if (error) goto exit_b;
initialize_c();
if (error) goto exit_c;
do_something();
exit_c:
terminate_c();
exit_b:
terminate_b();
exit_a:
terminate_a();
実際に Pure C ではけっこう見かける。モダンな言語では RAII とか try-finally を使うのが正しいアプローチだけれど、状況によってはこういう形で書きたくなることがある。まあこれって普通に reducible なフローなので、 goto
ならではの用法かといわれると微妙ではある。