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