C/C++技巧
+ -

C/C++技巧 异常处理的优雅do while(0)

2023-06-06 8 0

编写函数代码时,如果有大量的判断,如果失败就应该返回,但返回前需要释放上面申请的资源,比如说说堆内存的释放,句柄的关闭等。
那么如果这种情况很多,代码就会繁琐不堪,前且也很容易遗忘一些资源的释放,当后续再次修改代码时,代码又很不清晰。

假如有如下代码,对文件进行复制功能:

bool Test()
{
    FILE* fw = fopen("write.txt", "wb");
    if (fw == NULL)
    {
        return false;
    }

    FILE* fr = fopen("read.txt", "wb");
    if (fr == NULL)
    {
        fclose(fw);
        return false;
    }

    fseek(fr, 0, SEEK_END);
    int len = ftell(fr);
    fseek(fr, 0, SEEK_SET);

    char* pdata = (char*)malloc(len);
    if (pdata == NULL)
    {
        fclose(fw);
        fclose(fr);
        return false;
    }

    fread(pdata, 1, len, fr);
    fwrite(pdata, 1, len, fw);

    fclose(fw);
    fclose(fr);

    return true;
}

我们发现在每一步失败时都要释放上面已经申请到的资源,资源少了还好,资源太多,写的代码就有点难看了。
这里我们可使用do while(0)来进行代码结构优化:

bool Test()
{
    bool isok = false;
    FILE* fr = NULL;
    FILE* fw = NULL;
    char* pdata = NULL;
    do
    {
         fw = fopen("write.txt", "wb");
        if (fw == NULL)
        {
            break;
        }

        fr = fopen("read.txt", "wb");
        if (fr == NULL)
        {
            break;
        }

        fseek(fr, 0, SEEK_END);
        int len = ftell(fr);
        fseek(fr, 0, SEEK_SET);

        char* pdata = (char*)malloc(len);
        if (pdata == NULL)
        {
            break;
        }

        fread(pdata, 1, len, fr);
        fwrite(pdata, 1, len, fw);

        isok = true;

    } while (0);


    if (fw != NULL)
    {
        fclose(fw);
    }
    if (fr != NULL)
    {
        fclose(fr);
    }
    if (pdata != NULL)
    {
        free(pdata);
    }
    return isok;
}

这里我们可以看到,使用do while(0)只执行一次,用while循环的break语句巧妙地进行流程跳转,优化了代码结构。

0 篇笔记 写笔记

Windows系统USB驱动的断电异常处理STATUS_NO_SUCH_DEVICE
USB设备除非特殊需要,一般都是系统自带。所以我们根据不用开发相应的驱动,就算是我们要搞自定义的USB设备,微软也贴心的帮我们搞了一个WinUSB,只我们的的固件按照某定的要求,也可以实现自定义通讯。所以从上面的来看,没有什么特殊的地方要我们开发Windows系统的USB驱动。不过有的时候就是那么奇......
C/C++技巧 异常处理的优雅do while(0)
编写函数代码时,如果有大量的判断,如果失败就应该返回,但返回前需要释放上面申请的资源,比如说说堆内存的释放,句柄的关闭等。那么如果这种情况很多,代码就会繁琐不堪,前且也很容易遗忘一些资源的释放,当后续再次修改代码时,代码又很不清晰。假如有如下代码,对文件进行复制功能:bool Test(){......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!