首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C/C++ 函式設計精要(三):函式內部實作鐵律、斷言藝術與臨時物件優化

     編輯:VC 教學

6.3 函式內部實作規則

不同功能函式內部實作各異,但可在函式體「入口」與「出口」嚴把關,提升品質。

規則 6-3-1:入口處檢查參數有效性

許多錯誤源於非法參數。善用斷言防範。詳見 6.5 節。

規則 6-3-2:出口處檢查 return 正確性與效率

有回傳值的函式,「出口」即 return。切勿輕視:

  1. 不可回傳指向「堆疊記憶體」的指標/參考:該記憶體函式結束時自動銷毀。
    
    char* Func() {
        char str[] = "hello world"; // 位於堆疊
        return str; // 錯誤!
    }
    
  2. 搞清回傳的是「值」、「指標」還是「參考」。
  3. 回傳物件時考慮 return 效率:
    
    // 臨時物件語法:編譯器直接在外部儲存單元建構並初始化,省去複製與解構
    return String(s1 + s2);
    
    // 等價寫法但效率較低:
    String temp(s1 + s2);
    return temp; // 發生三事:1.建構temp 2.複製建構到外部儲存 3.temp解構
    

    內建型別同理:return int(x+y); 優於 int t=x+y; return t;,雖效率差異微小但程式碼更簡潔。

6.4 其他建議

  • 建議 6-4-1:函式功能單一,勿設計多用途函式。
  • 建議 6-4-2:函式規模小,控制在 50 行以內。
  • 建議 6-4-3:避免函式帶有「記憶」功能(相同輸入應產生相同輸出)。static 區域變數是函式的「記憶體」,盡量少用除非必要。
  • 建議 6-4-4:不僅檢查輸入參數,也檢查全域變數、檔案控制代碼等外部輸入有效性。
  • 建議 6-4-5:錯誤處理回傳值要清晰,避免使用者忽視或誤解。

6.5 使用斷言

程式分 Debug(內部測試)與 Release(發行用戶)版本。assert 是僅在 Debug 版本生效的巨集,用於檢查「不應該」發生的情況。


void* memcpy(void* pvTo, const void* pvFrom, size_t size) {
    assert((pvTo != NULL) && (pvFrom != NULL)); // 使用斷言
    byte* pbTo = (byte*)pvTo;
    byte* pbFrom = (byte*)pvFrom;
    while (size-- > 0) *pbTo++ = *pbFrom++;
    return pvTo;
}

若 assert 條件為假,程式中止(通常彈出對話框指示位置)。

assert 設計原則

  • 為避免 Debug/Release 差異,assert **不應產生任何副作用** → 實作為巨集而非函式。
  • 可視為任何系統狀態下安全的無害測試手段。
  • 程式在 assert 處終止,不代表含該 assert 的函式有錯,而是**呼叫者出錯**;assert 幫助定位錯誤源頭。

assert 註解的重要性

追蹤到 assert 卻不知其意圖極令人沮喪。解決方法簡單:**加上清晰註解**說明檢查什麼、為什麼檢查。這本是顯而易見的道理,卻常被忽略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved