現在、gotoステートメントが多用されるプロジェクトに取り組んでいます。gotoステートメントの主な目的は、複数のreturnステートメントではなく、ルーチン内に1つのクリーンアップセクションを含めることです。以下のように:
BOOL foo()
{
BOOL bRetVal = FALSE;
int *p = NULL;
p = new int;
if (p == NULL)
{
cout<<" OOM \n";
goto Exit;
}
// Lot of code...
Exit:
if(p)
{
delete p;
p = NULL;
}
return bRetVal;
}
これにより、コードの1つのセクション、つまりExitラベルの後のクリーンアップコードを追跡できるため、はるかに簡単になります。
しかし、私は多くの場所を読んだことがありますが、gotoステートメントを使用するのは悪い習慣です。
現在、Code Completeの本を読んでいますが、宣言に近い変数を使用する必要があると書かれています。gotoを使用する場合は、gotoを最初に使用する前にすべての変数を宣言/初期化する必要があります。そうしないと、コンパイラーはxx変数の初期化がgotoステートメントによってスキップされるというエラーを出します。
どちらが正しいですか?
スコットのコメントから:
あるセクションから別のセクションにジャンプするためにgotoを使用すると、コードが読みにくくなり、理解しにくくなるため、悪いように見えます。
しかし、gotoを使用して1つのラベルに進む場合は、問題ありません(?)。