在 C/C++ 很大一部分教材中都说不要使用 goto 关键字进行逻辑跳转,这是因为 goto 容易造成代码的不可维护,因为太多的跳转容易导致代码逻辑的凌乱,让人摸不到头脑,但是有一种情况是 goto 的不错应用场景,那就是在应用初始化失败时候来清理资源。
在《Linux C 程序设计王者归来》一书中有详细的解释说明。
接下来我们来看看在 redis 中的用法,其源代码在 src/anet.c 第 330 行:
if (!bound) {
anetSetError(err, "bind: %s", strerror(errno));
goto error;
}
如果 bound 失败,则直接跳转到 error 代码块,而 error 代码块就是处理资源释放的。
error:
if (s != ANET_ERR) {
close(s);
s = ANET_ERR;
}