goto似乎一直都不推荐使用,但是我在处理动态内存申请时候,感觉不用goto挺难维护代码。比如在一个函数有多个出口的时候,函数内有动态内存申请,那么退出的时候必然要去free,但如果每个return之前都要写free,这样在修改的时候很复杂。
void func() { malloc(); for (..) { if (..) { free(...); return; } if (..) { free(...); return; } } free(...) return; }
如果使用Goto的话,所有的动态内存释放都放在一个地方管理,而且代码似乎更加简洁了。不过C++就不需要考虑这个问题了。
void func() { malloc(); for (..) { if (..) { goto CLEAR; } if (..) { goto CLEAR; } } CLEAR: free(...); return; }
网上还有一些关于Goto的应用比如:
Ragel State Machine Compiler 有限状态机编译器,可以直接转混成C和C++源码
C里面还有setjmp和longjmp来完成goto的操作。
#include <stdio.h> #include <setjmp.h> int main() { jmp_buf env; int ret = 0; ret = setjmp(env); printf("ret=%d\n", ret); if (ret == 0) longjmp(env, 1); if (ret == 1) longjmp(env, 2); return 0; } // output: // ret = 0 // ret = 1 // ret = 2