成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言函數調用:【錯誤碼】和【返回值】傳遞的小思考

開發 后端
C 語言是一門面向過程的編程語言,通過一個又一個函數,把計算、過程控制等邏輯,包裝成一個個獨立的處理單元。

C 語言是一門面向過程的編程語言,通過一個又一個函數,把計算、過程控制等邏輯,包裝成一個個獨立的處理單元。

既然是函數調用,就一定會有參數和返回值的傳遞問題,因此也就產生了多種不同的編程范式,比如:

  • Posix 風格:函數返回值只用來表示成功(0)或失敗(非0),其他的輸出結果都使用參數來傳遞。
  • Unix 風格:函數返回值即包括錯誤代碼,也包括有用的輸出結果。
  • GAI 風格:與 Posix 有點類似,函數執行成功時返回0,否則就返回非0。

這篇文章就來輕松一下,聊一聊這些函數調用范式在開發過程中的一些小思考。

我們假設有一個算法函數,輸入兩個整型參數,輸出一個整型結果,并且輸出一個錯誤代碼。

第一種:輸入、輸出結果和錯誤碼全部通過參數傳遞

既然所有的信息都是通過參數來傳遞的,那么函數定義就應該是下面這樣:

  1. void func1(int a, int b, int *result, int *err_code) 
  2.     int c = a + b; 
  3.     *result = c; 
  4.     err_code = 0;  // 沿用 Linux 中的習慣,0 表示沒有發生錯誤。 

因為不需要返回任何數據,因此函數簽名的返回類型就是 void 。

因為調用者需要獲取輸出結果和錯誤碼,因此在形參中, result和err_code需要傳遞指針類型的變量。

面對這樣的函數簽名,調用者就必須顯示的定義兩個變量result和err_code,用來接收函數的輸出。

  1. // 調用者代碼 
  2.  
  3. int result, err_code; 
  4. func(1, 2, &result, &err_code); 
  5. if (0 == err_code) 
  6.     printf("Success. result = %d \n", result); 
  7. else 
  8.     printf("Failed. err_code = %d \n", err_code); 

這種函數范式的優點就是:在調用形式上統一,無論參數類型是什么(基礎類型、結構體等待),都是整齊劃一的函數調用寫法。

缺點就是有點累贅。

面對任何一個函數,調用者都必須定義一個err_code變量傳遞進去。

如果一個函數是過程控制類型的,壓根就不會產生什么錯誤碼,這樣的函數調用就顯得很臃腫,因為調用者壓根就不需要檢查錯誤碼。

第二種:函數返回值表示錯誤碼

也就是把第一種方式中的err_code參數,通過函數返回值賦值給調用者。

這種函數編程范式還是比較常見的,返回值只表示錯誤碼,其他的輸出結果都通過參數引用(指針)來傳遞。

  1. int func2(int a, int b, int *result) 
  2.     int c = a + b; 
  3.     *result = c; 
  4.     return 0;   // 返回錯誤碼 

這樣的函數范式跟POSIX風格很像了。

面對這樣的函數,調用者的寫法就會變成這樣:

  1. // 調用者代碼 
  2.  
  3. int result, err_code; 
  4. err_code = func2(1, 2, &result); 
  5. if (0 == err_code) 
  6.     printf("Success. result = %d \n", result); 
  7. else 
  8.     printf("Failed. err_code = %d \n", err_code); 

看起來好像跟第一種方式沒有什么本質區別,但是再看一下下面這樣的寫法呢:

  1. // 調用者代碼 
  2.  
  3. int result; 
  4. if (0 == func2(1, 2, &result)) 
  5.     printf("Success. result = %d \n", result); 
  6. else 
  7.     printf("Failed.\n"); 

這樣的代碼風格,在Linux中是不是很常見?當不需要處理錯誤碼時,這樣的編程方式會更方便一些。

第三種:函數返回值表示輸出結果

也就是把第一種方式中的result參數,通過函數返回值賦值給調用者。

  1. int func3(int a, int b, int *err_code) 
  2.     int c = a + b; 
  3.     err_code = 0; 
  4.     return c; 

這有點類似Unix中的風格:

返回結果中包括了有用的數據,但是它有一個局限:返回結果必須與錯誤碼的類型一致。

另外還有一個問題:如果 int 型的返回結果也可能是負數, 所以 Unix 中還必須使用另一個全局變量 errno 來單獨存儲錯誤碼,存在線程安全問題(可以使用線程局部存儲來解決)。

面對這樣的函數簽名,調用者的調用方式如下:

  1. // 調用者代碼 
  2.  
  3. int result, err_code; 
  4. result = func3(1, 2, &err_code)) 
  5.  
  6. if (0 == err_code) 
  7.     printf("Success. result = %d \n", result); 
  8. else 
  9.     printf("Failed.\n"); 

這種方式的缺點與第一種一樣:必須定義一個變量 err_code,來接收錯誤碼。

在不必要檢查錯誤碼的場合中,顯得有點多此一舉。

小結

以上的這三種函數調用方式,沒有好壞之分,只與每一位開發者的編碼習慣有關系。

而且在實際的項目代碼中,這三種方式都能看得到。

如果函數輸出結果是結構體呢?

剛才討論的三種方式中,函數輸出結果reuslt是一個整型,如果它是一個結構體類型的變量,那么哪一種方式相對比較好呢?

這就要注意另外兩點了:

結構體的賦值是需要時間開銷的;

結構體賦值時,需要考慮深拷貝、淺拷貝的問題;

當看完以上幾個小思考時,是不是覺得特別簡單、不屑一顧?

不妨繼續思考一步:在我們的實際編程過程中,是不是每次能夠注意、遵守這些小細節問題呢?

如果團隊中沒有強制的代碼規范,同事之間不會code review,我們是不是都會選擇偷懶、放過自己呢?我就是^-^

本文轉載自微信公眾號「IOT物聯網小鎮」,可以通過以下二維碼關注。轉載本文請聯系IOT物聯網小鎮公眾號。

 

責任編輯:武曉燕 來源: IOT物聯網小鎮
相關推薦

2025-01-17 10:52:26

定義函數編程Python

2025-01-02 10:37:13

2017-09-05 14:59:34

2019-09-19 09:41:58

C語言Go語言Java

2020-06-30 11:36:45

錯誤碼合理開發

2022-12-28 08:17:19

異常處理code

2010-07-20 11:37:00

Perl函數返回值

2010-07-21 10:32:05

Perl函數返回值

2017-11-20 11:53:38

CDN406錯誤故障

2023-01-29 23:51:07

微服務框架Go

2021-08-13 11:31:23

HTTP

2009-11-17 16:16:59

PHP遞歸函數

2009-09-07 03:07:11

C# Main方法

2011-07-19 17:33:53

存儲過程javaibatis

2021-12-19 23:58:51

Golang語言返回值

2024-01-29 00:30:00

C語言代碼數組

2021-08-06 14:35:26

鴻蒙HarmonyOS應用

2025-05-29 10:30:00

C++編程recv

2009-08-25 10:59:00

C#調用函數顯示值

2016-11-04 08:53:05

androidjava單元測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕亚洲欧美日韩在线不卡 | 国产成人99av超碰超爽 | 国产精品一区二区av | 国产精品爱久久久久久久 | 国产农村妇女毛片精品久久麻豆 | 亚州精品成人 | 国产成人一区二区三区 | 瑞克和莫蒂第五季在线观看 | 中文字幕在线观 | 欧美视频免费在线 | 久久久久亚洲 | 夜夜精品浪潮av一区二区三区 | 在线观看国产h | 欧洲精品在线观看 | 99精品免费久久久久久久久日本 | 久久久久久久av | 午夜男人视频 | 少妇无套高潮一二三区 | 日韩欧美操| 国内精品视频 | 成人妇女免费播放久久久 | 日本xx视频免费观看 | 国产在线观看一区二区三区 | 亚洲高清一区二区三区 | 男女免费在线观看视频 | 午夜精品一区 | 亚洲成人一区二区三区 | 日韩在线免费视频 | av黄色在线| 日韩综合在线视频 | 国产精品视频免费看 | 草b视频| 国产一区二区三区在线 | 国产精品入口麻豆www | 在线免费小视频 | 男人的天堂在线视频 | 爱爱视频在线观看 | 欧美日韩中文字幕在线播放 | 欧美国产精品一区二区 | 成人欧美一区二区三区白人 | 亚洲精品乱码久久久久久蜜桃 |