gpt4 book ai didi

c++ - 避免多重返回语句的方法

转载 作者:行者123 更新时间:2023-11-28 05:17:38 25 4
gpt4 key购买 nike

我努力寻找避免多个返回语句的方法,以便不会重复清理资源,这让我找到了以下方法:

  1. 使用 MACRO,如果错误不正常则执行清理。

    #define EXE(x) if (OK != (err = x)) goto cleanup;

    ErrorCode func ()
    {
    ErrorCode err = OK;

    EXE (fn1());
    EXE (fn2());

    cleanup:
    // do cleanup of resources
    return err;
    }
  2. 发生错误时使用 do...while() 中断

    ErrorCode func ()
    {
    ErrorCode err = OK;
    do
    {
    err = fn1();
    if (err != OK) break;

    err = fn2();
    if (err != OK) break;

    } while (false);

    // do cleanup of resources
    return err;
    }

这两种方式都允许在一个地方(紧接返回语句之上)清理资源并提高可读性。有没有其他方法可以避免多次返回?

最佳答案

您无需求助于 goto 来清除 C++ 中的内容。在自动范围内构造的所有对象都将被破坏。他们必须负责清理。

也就是说,您可以使用宏来简化错误检查代码的编写。

#define CHECK_ERROR(x) if (OK != x) return x;

ErrorCode func ()
{
ErrorCode err = OK;

err = fn1();
CHECK_ERROR(err);

err = fn2();
CHECK_ERROR(err);

return err;
}

更新,回应 OP 的评论

使用辅助类调用CloseHandle

struct HandlerMinder
{
HandleMinder(ErrorCode& err, HANDLE hObject) :
err_(err), hObject_(hObject) {}

~HandleMinder()
{
// Adapt the logic to suit your needs.
if ( err_ != OK )
{
CloseHandle(hObject_);
}
}

ErrorCode& err_;
HANDLE hObject_;
};

ErrorCode func ()
{
ErrorCode err = OK;
HANDLE object = <some handle>;
HandleMinder m(err, object);

err = fn1();
CHECK_ERROR(err);

err = fn2();
CHECK_ERROR(err);

return err;
}

关于c++ - 避免多重返回语句的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42289800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com