目前我正在研究一个大量使用 goto 语句的项目。goto 语句的主要目的是在例程中有一个清理部分,而不是多个返回语句。如下所示:
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;
}
这使得它更容易,因为我们可以在代码的一个部分(即 Exit 标签之后)跟踪我们的清理代码。
但是,我已经阅读了很多地方,使用 goto 语句是不好的做法。
目前我正在阅读Code Complete这本书,它说我们需要使用接近其声明的变量。如果我们使用 goto,那么我们需要在第一次使用 goto 之前声明/初始化所有变量,否则编译器将给出错误,即 goto 语句跳过了 xx 变量的初始化。
哪种方式是正确的?
来自斯科特的评论:
看起来使用 goto 从一个部分跳转到另一个部分是不好的,因为它使代码难以阅读和理解。
但是,如果我们只使用 goto 前进并转到一个标签,那么它应该没问题(?)。