goto主要用于函数执行到一定步骤后,跳转到返回成功或失败的代码。那么为什么不能直接返回而需要使用goto呢?就我个人理解,使用goto的好处之一是使代码更加简洁清晰。
例如,当函数中有多个地方需要返回成功或失败,而且返回之前可能需要有固定的代码(如释放内存),如果不使用goto语句,意味着需要在每个返回的地方都写上同样的代码,造成代码冗余。举个例子:
if(contition1)
{
free(p);
return -1;
}
while(condition2)
{
//do something
if(condition3)
{
free(p);
return -1;
}
//do something
}
free(p);
return 0;
以上可以改为:
if(contition1)
goto error;
while(condition2)
{
//do something
if(condition3)
goto error;
//do something
}
free(p);
return 0;
error:
free(p);
return -1;
这样,结构看起来更加清晰,也方便维护,比方说之后函数中还需要释放指针p2指向的空间,原来的写法就要在每个return的地方都加上free(p2),十分麻烦,而goto的写法只要在error标签之后增加一句free(p2)即可。
注意,goto语句和标签之间不能有变量声明,否则会报错C2362,说跳过了变量的初始化操作,网上查阅原因如下:
goto 不能向前跳过变量定义语句,给出的理由是可能引起未定义的变量使用。当确实要这样使用时,需要把定义语句使用{}括起来。
最后,标签本身没有作用域的,只是一个标志点。但是goto本身有限制,只能是当前函数。所以,从这个角度来说,标签的作用域也可以说是当前函数。
参考: