使用goto的優雅並避免結構的混亂
將要跳轉到的語句用do{…}while(0) 包起來即可。
reference
#defien N 10
bool Execute()
{
// 分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOk = true;
// 執行並進行錯誤處理
bOk = func1();
if(!bOk)
{
free(p);
p = NULL;
return false;
}
bOk = func2();
if(!bOk)
{
free(p);
p = NULL;
return false;
}
bOk = func3();
if(!bOk)
{
free(p);
p = NULL;
return false;
}
// ..........
// 執行成功,釋放資源並返回
free(p);
p = NULL;
return true;
}
#defien N 10
bool Execute()
{
// 分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOk = true;
// 執行並進行錯誤處理
bOk = func1();
if(!bOk) goto errorhandle;
bOk = func2();
if(!bOk) goto errorhandle;
bOk = func3();
if(!bOk) goto errorhandle;
// ..........
// 執行成功,釋放資源並返回
free(p);
p = NULL;
return true;
errorhandle:
free(p);
p = NULL;
return false;
}
#defien N 10
bool Execute()
{
//分配資源
int *p = (int *)malloc(N * sizeof(int));
bool bOK = true;
do {
//執行並進行錯誤處理
bOK = fun1();
if(!bOK) break;
bOK = fun2();
if(!bOK) break;
bOK = fun3();
if(!bOK) break;
//.........
} while(0);
//釋放資源
free(p);
p = NULL;
return bOK;
}