Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回前测试错误和清除的正确方法_C_Coding Style_Error Handling_Return - Fatal编程技术网

C 返回前测试错误和清除的正确方法

C 返回前测试错误和清除的正确方法,c,coding-style,error-handling,return,C,Coding Style,Error Handling,Return,就编码风格而言,以下两种实现中的哪一种更好?为什么 UINT Fn1() { HKEY hRegKey; if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) != ERROR_SUCCESS) return ERROR_KEY_OPEN; if(RegQueryValueEx(hRegKey, VAL_A_NAME, ...) != ERROR_SUCCESS) { RegCloseKey(h

就编码风格而言,以下两种实现中的哪一种更好?为什么

UINT Fn1()
{
    HKEY hRegKey;

    if(RegOpenKeyEx(..., KEY_NAME, &hRegKey) != ERROR_SUCCESS)
        return ERROR_KEY_OPEN;
    if(RegQueryValueEx(hRegKey, VAL_A_NAME, ...) != ERROR_SUCCESS)
    {
        RegCloseKey(hRegKey);
        return ERROR_KEYVAL_A;
    }

    if(RegQueryValueEx(hRegKey, VAL_B_NAME, ...) != ERROR_SUCCESS)
    {
        RegCloseKey(hRegKey);
        return ERROR_KEYVAL_B;
    }

    RegCloseKey(hRegKey);
    return ERROR_SUCCESS;
}

还有,还有更好的方法吗?

注意:请不要混淆代码片段的细节-强调代码流和风格。这在很大程度上取决于个人品味。我个人认为两者都不好看,也不容易遵循。我个人喜欢的C格式是:

int
fn(void)
{
    struct foo *foo;
    int error = 0;
    if ((foo = foo_open(...)) == NULL)
        return FOO_ERROR_OPEN;
    if (foo_do_something(1)) {
        error = FOO_ERROR_1;
        goto out;
    }
    if (foo_do_something(2)) {
        error = FOO_ERROR_2;
    }
out:
    foo_close(foo);
    return error;
}
但是正如所说的,这是一个品味的问题,关于这一点有很多的意见,就像程序员一样。我更喜欢这种风格,因为我在职业生涯早期使用过的许多代码都是这样编写的,这使它对我来说最具可读性


如果我必须选择一种你介绍的样式,我会选择1,因为2看起来很凌乱,因为它有很深的凹痕。我的经验法则是,读数随着压痕深度的增加而减小。

这个答案对于C或C++是不同的,但是你都标记了。此外,这是一个相当主观的问题。请回答-对于一般情况。我没有把这个问题转换成更一般的形式,让它更真实。这个问题以前被问过:等等。这两次,回答者都喜欢“提前返回”(即你的第一个版本)@ArjunShankar谢谢你的指点。但这种情况在返回前所需的清理方面有所不同。我已经删减了我的问题,我认为它保持打开状态对其他类似查询的人来说是有用的。嗯,是的,转到这里并不是一个坏的选择。@UjjwalSingh有一个资源可以释放,这基本上是过度的,但是当你在一个函数中持有三个锁和五个临时分配的内存块时,后藤真的把事情弄清楚了。你是对的——我以第一个结束了它。
int
fn(void)
{
    struct foo *foo;
    int error = 0;
    if ((foo = foo_open(...)) == NULL)
        return FOO_ERROR_OPEN;
    if (foo_do_something(1)) {
        error = FOO_ERROR_1;
        goto out;
    }
    if (foo_do_something(2)) {
        error = FOO_ERROR_2;
    }
out:
    foo_close(foo);
    return error;
}