コンパイラが C++ 言語の例外をサポートしていないプラットフォームでアプリケーションを開発しています。
API を呼び出すときは、返された結果からエラー コードを確認する必要があります。エラーが発生したときに、クリーンアップを行う必要がある場合があります。エラー コードをチェックするマクロ CHECK_ERROR_GOTO を定義します。というわけでこんなコード。
int res = callAPI1();
CHECK_ERROR_GOTO(res, cleanup);
A* object1 = callAPI2(); // HERE WE WILL GET ERROR,
//BECAUSE GOTO SKIP INITIALIZATION OF OBJECT1
CHECK_ERROR_GOTO(object1 == NULL, cleanup);
C* object2 = callAPI3(object2);
CHECK_ERROR_GOTO(object2 == NULL, cleanup)
return 0;
cleanup:
//Cleanup code here.
delete object1
delete object2
コードが示すように、goto によってスキップされた object1 を初期化するため、object1
andobject2
を関数のヘッダーに配置する必要があります。{} を追加してローカル スコープを作成しても機能しません。これは、クリーンアップ コードでローカル変数を使用する必要があるためです。
とにかく、コードを整理できるので、関数の先頭に変数を初期化する必要はありませんか?