【发布时间】:2019-09-29 22:39:11
【问题描述】:
在嵌入式系统的上下文中,给定以下函数结构:
-
返回变量的条件赋值:
int foo(int x) { int status; if (is_valid(x)) { /* long computation with x */ status = /* some result */; } else status = STATUS_ERROR; return status; } -
早日归来:
int foo(int x) { if (!is_valid(x)) return STATUS_ERROR; /* long computation with x */ return /* some result */; }
在我看来,后者应该比前者更受欢迎,因为:
- 它不需要对
status进行额外和不必要的定义和赋值; - 它清楚地向读者说明,如果发生错误,除了返回
STATUS_ERROR之外什么都不做,它写在函数的开头,以语言允许的最清晰的方式; - 它允许普通大小写的代码更扁平,因为它不必为
if-else缩进。
但是,我已经看到前者被用于几个不同的项目。我认为造成这种情况的原因可能与开发的调试步骤有关,以允许:
- 具有单点返回,可以更轻松地放置断点;
- 通过
status检查即将返回的值(特别是在单次返回时)。
我是否认为这是为了调试而完成的?还有其他理由更喜欢 1. 而不是 2.? 1. 在裸机开发环境中被认为是良好实践吗?
请注意,与this question 不同,在x 无效的情况下返回错误代码之前不做任何工作。
【问题讨论】:
-
Linux 内核编码风格更喜欢第二个示例。但这是一个偏好问题,而不是你是否在调试。
-
通常最好使用第二种方法,先测试一些东西并报告错误,然后可能测试其他东西并报告错误,最后执行主要操作,报告成功。当只有一个测试时,最好将较小的代码块(错误报告)放在第一位,因为它更容易识别程序的块。在第一种情况下,您将有关错误情况的信息隐藏在底部,距离触发条件的测试数英里。早期回报通常是有益的。
标签: c if-statement return