もう一つ

goto なんだけど、やっぱり、使うべきではない?
でも、アセンブラを使っていると、普通に JMP とか書いている。
その感覚で考えちゃうと、goto も、うまく使えば、
ずっとシンプルに書ける場面も結構あるように思う。
実際、そういう主張も、いくらか見掛けたりする。


例えば、

if ((fp1=fopen(〜)) == NULL)
{
    return -1;
}
if ((fp2=fopen(〜)) == NULL)
{
    fclose(fp1);
    return -1;
}
if ((fp3=fopen(〜)) == NULL)
{
    fclose(fp1);
    fclose(fp2);
    return -1;
}

// 何か処理

fclose(fp1);
fclose(fp2);
fclose(fp3);

return 0;

みたいな場合。

int ret = -1;

FILE * fp1 = NULL;
FILE * fp2 = NULL;
FILE * fp3 = NULL;

if ((fp1 = fopen(〜)) == NULL) goto end;
if ((fp2 = fopen(〜)) == NULL) goto end;
if ((fp3 = fopen(〜)) == NULL) goto end;

// 何か処理

ret = 0;

end:
if (fp1 != NULL) fclose(fp1);
if (fp2 != NULL) fclose(fp2);
if (fp3 != NULL) fclose(fp3);

return ret;

とか書いちゃダメなのかな?