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;
}