【发布时间】:2022-01-23 11:53:14
【问题描述】:
什么是中止 C 中错误的最佳实践?
在我们的代码库中,我们目前有一个使用模式
#define CHECKERROR(code) if(code) { return code; }
但这会导致资源没有在表单的代码中关闭
/* not actual code due to non-disclosure restrictions */
int somefunction() {
handle_t res1, res2;
int errorcode;
res1 = getResource();
res2 = getResource();
errorcode = action1(res1, res2);
CHECK(errorcode);
errorcode = action2(res1, res2);
CHECK(errorcode);
freeResource(res1);
freeResource(res2);
return errorcode;
}
我遇到了这种模式
/* initialize resources */
do {
/* ... */
errorcode = action();
if(errorcode) break;
/* ... */
} while(0);
/* cleanup resources */
return errorcode;
以前在文章中,但现在找不到任何讨论它的来源。
什么是 C 语言的惯用做法? do { } while(0); 模式是否符合条件?有没有一种惯用的方式让它更清楚,它不是打算成为一个循环,而是一个具有非本地退出的块?
【问题讨论】:
-
我喜欢这个问题,但正如目前所问的那样,它会征求意见,并且以目前的形式,它不会在 SO 上长时间保持开放状态。迁移到 SO 需要您更新问题。
-
我不确定它是否是惯用的,但我不知道有比
do { ... } while (0)构造更好的解决方案,它真的可以让你跳跃(阅读 break 为转到)错误处理代码。 -
没有最佳实践。你可以试试“cleanup”属性
-
有一个提议将“延迟”机制添加到 C23 以某种方式标准化错误处理。看看gustedt.wordpress.com/2020/12/14/a-defer-mechanism-for-c
-
你考虑过使用
atexit()吗?
标签: c resource-management