電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 131|回復(fù): 0
收起左側(cè)

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

[復(fù)制鏈接]

418

主題

418

帖子

4293

積分

四級(jí)會(huì)員

Rank: 4

積分
4293
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-4 20:04:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
作者 | strongerHuang
微信公眾號(hào) | strongerHuang
學(xué)電子的小伙伴都知道,我們的邏輯電平0代表低,1代表高。還有,邏輯運(yùn)算時(shí),0代表假,非0值代表真。
那么,你發(fā)現(xiàn)一個(gè)問題沒有,我們C/C++編程時(shí),很多情況下都是返回0代表成功?
比如:RTOS創(chuàng)建任務(wù)返回“錯(cuò)誤信息”

OS_ERR_NONE這個(gè)值就是宏定義的0:
  • #define OS_ERR_NONE      0u其實(shí)不止這個(gè)返回值,還有很多都是類似0代表成功(或無錯(cuò)誤)。
    在嵌入式C/C++編程中,函數(shù)返回0代表成功,一種廣泛接受的約定。
    為什么會(huì)有這種約定?其實(shí)背后都是有故事的,下面簡(jiǎn)單說幾點(diǎn)。
    1、歷史原因在早期的C語言編程實(shí)踐中,特別是在早期的Unix系統(tǒng)編程中,0被用作成功執(zhí)行的返回值,即程序執(zhí)行成功沒有錯(cuò)誤發(fā)生,而非0值則表示出現(xiàn)了某種錯(cuò)誤。
    而Unix在當(dāng)時(shí)又非常流行,后來,這種習(xí)慣隨著這些系統(tǒng)和語言的普及而變得普遍。
    2、統(tǒng)一規(guī)范因?yàn)橛星懊?Uinx 的案例,后面的開發(fā)者為了代碼的可讀性和可維護(hù)性,許多編程標(biāo)準(zhǔn)和規(guī)范都使用0表示成功,這樣可以使得代碼在不同的開發(fā)者和項(xiàng)目之間保持一致性。
    3、行業(yè)潛規(guī)則隨著時(shí)間的推移,這種使用0表示成功、非零值表示失敗的約定,逐漸成為了C語言及嵌入式編程中的行業(yè)潛規(guī)則。遵守這一潛規(guī)則可以使代碼更易于理解和維護(hù),同時(shí)也便于不同程序員之間的協(xié)作。
    同時(shí),在編程社區(qū)中,這種約定已經(jīng)深入人心,成為了編程實(shí)踐中的一種標(biāo)準(zhǔn)做法。因此,即使在新開發(fā)的嵌入式系統(tǒng)中,也往往會(huì)延續(xù)這一潛規(guī)則。
    4、符合邏輯從邏輯上講,成功通常被視為一種特殊情況(即只有一種可能),而失敗則可能由多種原因造成(即有多種可能)。
    比如上面舉的例子RTOS中,存在很多種錯(cuò)誤:
  • #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你會(huì)發(fā)現(xiàn),成功只有一種,錯(cuò)誤有100多種。因此,使用唯一的0值來表示成功,并使用非零值來表示多種可能的失敗情況,在邏輯上更為清晰和合理。
    5、兼容性更強(qiáng)很多時(shí)候,我們做項(xiàng)目都會(huì)使用第三方庫,這個(gè)時(shí)候,如果你項(xiàng)目的規(guī)則和和第三方不一直,調(diào)試或維護(hù)代碼就很惱火,一會(huì)0,一會(huì)兒非0,你都不知道究竟是什么意思了。
    6、其他其實(shí)還有很多原因,什么編碼習(xí)慣、錯(cuò)誤處理等,大致就是保持代碼一致性的意思。當(dāng)然,也歡迎大家留言說出更多原因。
    說了這么多,其實(shí),我們都是建立在別人成功的基礎(chǔ)上,或者說站在巨人的肩膀上。你不要想著自己搞一套規(guī)則出來,這種情況,一般人都是找麻煩,除非你是真正的牛人。
    ------------ END ------------



    ●專欄《嵌入式工具
    ●專欄《嵌入式開發(fā)》
    ●專欄《Keil教程》
    ●嵌入式專欄精選教程

    關(guān)注公眾號(hào)回復(fù)“加群”按規(guī)則加入技術(shù)交流群,回復(fù)“1024”查看更多內(nèi)容。
    點(diǎn)擊“閱讀原文”查看更多分享。
  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表