CppCoreGuidelines ES.76 避免 goto
10 May 2023
“Avoid goto
”
理由
可读性好,避免错误。 goto
是机器产生的代码,除了 goto
还有其他更好的适合人类的控制结构。
例外
从内层循环跳出的时候,还是会用得到 goto
。但是一般总是向前跳转。
for (int i = 0; i < imax; ++i) for (int j = 0; j < jmax; ++j) { if (a[i][j] > elem_max) goto finished; // ... } finished: // ...
坏例子
有很多这样的例子,大量的代码用了 C 的 goto-exit 习语:
void f() { // ... goto exit; // ... goto exit; // ... exit: // ... common cleanup code ... }
其实这是一种析构函数的临时模拟。最好还是把你用到的资源封装到对象中,通过析构函数做清理工作。如果因为某些原因,无法通过析构函数完成所有的清理工作,可以考虑用 gsl::finally()
。这个方法比 goto-exit 更可靠。
强化
标记用到 goto
的地方。或者,能够标记除了从嵌套循环跳出语句之外的所有 goto