打印
[其它应用]

为啥C/C++返回0代表成功?

[复制链接]
1795|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七毛钱|  楼主 | 2024-9-27 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学电子的小伙伴都知道,我们的逻辑电平0代表低,1代表高。还有,逻辑运算时,0代表假,非0值代表真。
那么,你发现一个问题没有,我们C/C++编程时,很多情况下都是返回0代表成功?
比如:RTOS创建任务返回“错误信息”OS_ERR_NONE这个值就是宏定义的0:#define OS_ERR_NONE      0u其实不止这个返回值,还有很多都是类似0代表成功(或无错误)。
在嵌入式C/C++编程中,函数返回0代表成功,一种广泛接受的约定。
为什么会有这种约定?其实背后都是有故事的,下面简单说几点。
1、历史原因在早期的C语言编程实践中,特别是在早期的Unix系统编程中,0被用作成功执行的返回值,即程序执行成功没有错误发生,而非0值则表示出现了某种错误。
而Unix在当时又非常流行,后来,这种习惯随着这些系统和语言的普及而变得普遍。
2、统一规范因为有前面 Uinx 的案例,后面的开发者为了代码的可读性和可维护性,许多编程标准和规范都使用0表示成功,这样可以使得代码在不同的开发者和项目之间保持一致性。
3、行业潜规则随着时间的推移,这种使用0表示成功、非零值表示失败的约定,逐渐成为了C语言及嵌入式编程中的行业潜规则。遵守这一潜规则可以使代码更易于理解和维护,同时也便于不同程序员之间的协作。
同时,在编程社区中,这种约定已经深入人心,成为了编程实践中的一种标准做法。因此,即使在新开发的嵌入式系统中,也往往会延续这一潜规则。
4、符合逻辑从逻辑上讲,成功通常被视为一种特殊情况(即只有一种可能),而失败则可能由多种原因造成(即有多种可能)。
比如上面举的例子RTOS中,存在很多种错误:
#define OS_ERR_NONE                     0u
#define OS_ERR_EVENT_TYPE               1u#define OS_ERR_PEND_ISR                 2u#define OS_ERR_POST_NULL_PTR            3u#define OS_ERR_PEVENT_NULL              4u#define OS_ERR_POST_ISR                 5u#define OS_ERR_QUERY_ISR                6u#define OS_ERR_INVALID_OPT              7u#define OS_ERR_ID_INVALID               8u#define OS_ERR_PDATA_NULL               9u#define OS_ERR_TIMEOUT                 10u#define OS_ERR_EVENT_NAME_TOO_LONG     11u#define OS_ERR_PNAME_NULL              12u#define OS_ERR_PEND_LOCKED             13u#define OS_ERR_PEND_ABORT              14u#define OS_ERR_DEL_ISR                 15u#define OS_ERR_CREATE_ISR              16u#define OS_ERR_NAME_GET_ISR            17u#define OS_ERR_NAME_SET_ISR            18u#define OS_ERR_ILLEGAL_CREATE_RUN_TIME 19u
//...
#define OS_ERR_TLS_NO_MORE_AVAIL      160u#define OS_ERR_TLS_ID_INVALID         161u#define OS_ERR_TLS_NOT_EN             162u#define OS_ERR_TLS_DESTRUCT_ASSIGNED  163u#define OS_ERR_OS_NOT_RUNNING         164u你会发现,成功只有一种,错误有100多种。因此,使用唯一的0值来表示成功,并使用非零值来表示多种可能的失败情况,在逻辑上更为清晰和合理。
5、兼容性更强很多时候,我们做项目都会使用第三方库,这个时候,如果你项目的规则和和第三方不一直,调试或维护代码就很恼火,一会0,一会儿非0,你都不知道究竟是什么意思了。
6、其他其实还有很多原因,什么编码习惯、错误处理等,大致就是保持代码一致性的意思。当然,也欢迎大家留言说出更多原因。
说了这么多,其实,我们都是建立在别人成功的基础上,或者说站在巨人的肩膀上。你不要想着自己搞一套规则出来,这种情况,一般人都是找麻烦,除非你是真正的牛人。

使用特权

评论回复
沙发
classroom| | 2024-10-4 19:14 | 只看该作者
我喜欢站在巨人的肩膀上工作

使用特权

评论回复
板凳
tpgf| | 2024-10-8 15:13 | 只看该作者
在早期的Unix系统编程实践中,0被用作成功执行的返回值,非0值则表示出现了某种错误

使用特权

评论回复
地板
heimaojingzhang| | 2024-10-9 07:08 | 只看该作者
许多编程标准和规范都采用了0表示成功的约定

使用特权

评论回复
5
keaibukelian| | 2024-10-9 08:17 | 只看该作者
从逻辑上讲,成功通常是一种特殊情况(只有一种可能),而失败则有多种可能的原因。因此,使用唯一的0值来表示成功

使用特权

评论回复
6
paotangsan| | 2024-10-10 08:08 | 只看该作者
在项目中使用第三方库时,如果项目的编码规则与第三方库保持一致,那么调试或维护代码就会更加方便。因此,遵循0表示成功的约定有助于提高代码的兼容性

使用特权

评论回复
7
renzheshengui| | 2024-10-10 09:18 | 只看该作者
通过统一的返回值约定,可以使程序员更容易地理解代码的含义,快速判断函数调用的结果。这种约定的初衷是为了简化程序员的编程,使得代码更易于理解和维护

使用特权

评论回复
8
wakayi| | 2024-10-10 10:36 | 只看该作者
在某些情况下,返回0的代价最小,或者简单的说,返回零的效率最高

使用特权

评论回复
9
chenqianqian| | 2024-10-16 08:11 | 只看该作者
解释到位,用0肯定是有合理原因的。

使用特权

评论回复
10
yangxiaor520| | 2024-10-22 08:15 | 只看该作者
因为成功无需在分类,就一种情况,而错误类型可能有很多种。

使用特权

评论回复
11
呐咯密密| | 2024-10-22 10:29 | 只看该作者
这就是个约定的问题吧

使用特权

评论回复
12
可怜的小弗朗士| | 2024-10-22 11:43 | 只看该作者
行业潜在规则规定吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

341

主题

2328

帖子

4

粉丝