以下情况下,可以考虑用goto语句:
1、从多重循环中直接跳出 ;
2、出错时清除资源;
3、可增加程序的清晰度的情况。
注意:我们应该尽量避免使用goto语句。因为不加限制地使用goto语句,会破坏清晰的程序结构,会使程序的可读性变差,甚至成为不可维护的"面条代码"。经常带来错误或隐患,比如它可能跳过了某些对象的构造,变量的初始化,重要的计算等语句。
以下用第二点‘出错时清除资源’的情况做个例子
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd = -1;
char * buf = NULL;
int file_len;
int read_len;
fd = open("/home/trd/C_C++_test/fpversion.txt",O_RDWR);
if( fd < 0 )
{
puts("FILE OPEN FAILED\n");
exit(-1);
}
file_len = lseek(fd,0,SEEK_END);
buf = (char *)malloc(file_len);
if(buf == NULL)
{
puts("malloc failed");
goto FD_ERROR;
}
lseek(fd,0,SEEK_SET);
read_len = read(fd,buf,file_len);
if(read_len != file_len)
{
puts("diffrent length for reading");
goto MALLOC_ERROR;
}
printf("fpversion:%s\n",buf);
/*这里注意:1.执行了goto语句,不会再执行该goto语句往下的代码块
2.未执行goto语句,代码会按照顺序往下执行包括标签下的代码块
*/
MALLOC_ERROR:
if(buf)
{
puts("free space");
free(buf);
}else
{
printf("buff is NULL\n");
}
FD_ERROR:
if(fd > 0)
{
puts("malloc faile,close file");
close(fd);
fd = -1;
}
return 0;
}