cppcoreguidelines-avoid-goto

使用 goto 进行控制流容易出错,应使用循环结构进行替换。仅允许嵌套循环中的向前跳转。

此检查实现了 C++ 核心准则中的 ES.76 以及高完整性 C++ 编码标准中的 6.3.1

有关避免使用 goto 进行编程的原因的更多信息,您可以阅读著名论文 反对 GO TO 语句的论据

此检查诊断所有语言模式下向后跳转的 goto。这些应该用 C/C++ 循环结构替换。

// Bad, handwritten for loop.
int i = 0;
// Jump label for the loop
loop_start:
do_some_operation();

if (i < 100) {
  ++i;
  goto loop_start;
}

// Better
for(int i = 0; i < 100; ++i)
  do_some_operation();

现代 C++ 仅需要 goto 来跳出嵌套循环。

for(int i = 0; i < 100; ++i) {
  for(int j = 0; j < 100; ++j) {
    if (i * j > 500)
      goto early_exit;
  }
}

early_exit:
some_operation();

所有其他 goto 的用法都将在 C++ 中进行诊断。