我们正在一个编译器不支持 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
放在函数头中,这很糟糕,因为我们应该将它放在我们需要使用的地方。并且添加 {} 来创建局部作用域是行不通的,因为清理代码需要使用局部变量。
所以无论如何我们可以安排代码,所以我们不需要在函数的开头放置变量初始化?