这个问题实际上是不久前在Programming.reddit.com上interesting discussion分的结果.它基本上归结为以下代码:

int foo(int bar)
{
    int return_value = 0;
    if (!do_something( bar )) {
        goto error_1;
    }
    if (!init_stuff( bar )) {
        goto error_2;
    }
    if (!prepare_stuff( bar )) {
        goto error_3;
    }
    return_value = do_the_thing( bar );
error_3:
    cleanup_3();
error_2:
    cleanup_2();
error_1:
    cleanup_1();
    return return_value;
}

在这里使用goto似乎是最好的方法,可以产生所有可能的代码中最干净、最高效的代码,至少在我看来是这样.引用史蒂夫·麦康奈尔在《Code Complete》中的话:

GOTO在以下 routine 中很有用,该 routine 分配资源,执行 对这些资源的操作,以及 然后重新分配资源.使用一个 后藤,你可以在一段时间内打扫干净 代码的一部分.后藤降低了 你忘记的可能性 解除对每个地方的资源分配 您检测到错误.

对这种方法的另一个支持来自Linux Device Drivers本书"在this section个人中".

你认为如何?本例是C中goto的有效用法吗?您是否更喜欢其他方法,它们会产生更复杂和/或效率更低的代码,但避免使用goto

推荐答案

FWIF,我发现你在问题示例中给出的错误处理习惯用法比迄今为止答案中给出的任何选项都更可读、更容易理解.虽然goto通常是一个坏主意,但如果以简单统一的方式执行,它对于错误处理可能很有用.在这种情况下,尽管它是goto,但它是以定义明确、或多或少 struct 化的方式使用的.

C++相关问答推荐

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

无法用C++编译我的单元测试

SDL 2.0-从数组渲染纹理

为什么我一直收到分段错误?

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

非正规化边缘毛刺

如何在C++中处理按键

I2C外设在单次交易后出现故障

For循环中的变量行为不符合预期.[C17]

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

将回调/基于事件的C API转换为非回调API

C23标准是否向后兼容?

是否有单独的缓冲区用于读写库调用?

赋值两侧的后置增量,字符指针

C中2个数字的加法 - 简单的人类方法

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

使用 c 中的 write() 函数将非 ASCII 字符写入标准输出

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

OpenGL 中的非渐变 colored颜色 变化