《華為C語言編程規范》summary


C coding style

代碼總體原則

  • 清晰第一。清晰性是易於維護、易於重構的程序必須具備的特征。
  • 簡潔為美。簡介就是易於理解並且易於實現。
  • 選擇合適的風格,與源代碼風格保持一致。

頭文件

頭文件的設計體現了大部分的系統設計,不合理的頭文件布局是編譯時間過長的根因,實際上是不合理的設計。

  • 頭文件中適合放置接口的聲明,不適合放置實現。
  • 頭文件應當職責單一。
  • 頭文件應向穩定的方向包含。
  • 每一個.c文件應有一個同名的.h文件,用於聲明需要對外公開的接口。
  • 禁止頭文件循環依賴。
  • 禁止包含用不到的頭文件。
  • 頭文件應當自包含。
  • 編寫內部#include保護符(#define保護)。
  • 禁止在頭文件中定義變量。
  • 只能通過包含頭文件的方式使用其他C提供的接口,禁止在C中通過extern的方式使用外部函數接口和變量。
  • 禁止在extern "C"中包含頭文件。

函數

函數設計的精髓:編寫整潔函數,同事把代碼有效組織起來。

  • 一個函數僅完成一個功能。
  • 重復代碼應該盡可能提煉成函數。
  • 避免函數過長,新增函數不超過50行。
  • 避免函數的代碼塊嵌套過深,新增函數的代碼塊嵌套不超過4層。
  • 可重入函數應避免使用共享變量;若需要使用,則應該通過互斥手段對其加以保護。
  • 對參數的合法性檢查,由調用者負責還是接口函數負責,應在項目組模塊內統一規定。缺省由調用者負責。
  • 對函數的錯誤返回碼要全面處理。
  • 設計高扇入,合理扇出(小於7)的函數。扇出是指調用其它函數的數目。扇入是指有多少上級函數調用它。
  • 廢棄代碼要及時清除。
  • 函數參數不變使用const限定。
  • 函數應避免使用全局變量、靜態局部變量和I/O操作,不可避免的地方應集中使用。
  • 檢查函數所有非參數輸入的有效性,如數據文件、公共變量等。
  • 函數的參數個數不超過5個。
  • 在源文件范圍內聲明和定義的所有函數,除非外部可見,否則應該加static關鍵字。

標識符

  • 標識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解。
  • 產品、項目組內應保持同意的命名分格。
  • 盡量避免名字中出現數字編號,除非邏輯上確實需要。
  • 重構、修改部分代碼時,應該保持和原有代碼風格一致。
  • 文件命令統一采用小寫字符。因為不同系統對文件名大小寫處理會有不同(windows不區分大小寫,但是linux系統則區分)。
  • 全局變量應增加“g_”前綴。
  • 靜態變量應增加“s_”前綴。
  • 禁止使用單字節命名變量,但是允許定義i,j,k作為局部循環變量。
  • 不建議使用匈牙利命名法。
  • 對於數值或者字符串常量的定義,建議采用全大寫字母,單詞之間加下划線的方式命名。

變量

  • 結構功能單一,不要設計面面俱到的數據結構。
  • 不用或者少用全局變量
  • 防止局部變量與全局變量同名
  • 通訊過程中使用的機構,必須注意字節序。
  • 嚴禁使用未經初始化的變量作為右值。
  • 使用面向接口編程思想,通過API訪問數據。
  • 盡量減少沒有必要的數據類型默認轉換與強制轉換。

宏和常量

  • 用宏定義表達式時,要使用完備的括號。
  • 將宏定義的多條表達式放在大括號中。
  • 使用宏時,不允許參數發生變化。
  • 不允許直接使用魔鬼數字。
  • 除非必要,應盡可能使用函數代替宏。
  • 常量建議用const定義代替宏。

質量

  • 時刻注意易混淆的操作符
  • 必須了解編譯系統的內存分配方式,特別是編譯系統對不同類型的變量的內存分配規則,如局部變量在何處分配、靜態變量在何處分配等。
  • 不僅關注接口,同樣要關注實現。
  • 禁止內存操作越界。
  • 禁止內存泄漏。
  • 禁止引用已經釋放的內存空間。
  • 編程時,要防止差1錯誤。
  • switch語句必須有default分支。
  • 函數中分配的內存,在函數退出之前要釋放。
  • 不要濫用goto語句。
  • 時刻注意表達式是否會上溢、下溢。

程序效率

  • 在保證軟件系統的正確性、簡潔、可維護性、可靠性及可測試性的前提下,提高代碼的效率。
  • 通過對數據結構、程序算法的優化來提高效率。
  • 將不變條件的計算移到循環體外。
  • 對於多維大數組,避免來回跳躍式訪問數組成員。
  • 創建資源庫,以減少分配對象的開銷。
  • 將多次被調用的“小函數”改為inline函數或者宏實現。

注釋

  • 優秀的代碼可以自我解釋,不通過注釋即可輕易讀懂。
  • 注釋的內容要清楚、明了,含義准確,防止注釋二義性。
  • 修改代碼時,維護代碼周邊的所有注釋,以保證注釋與代碼的一致性。不再有用的注釋要刪除。
  • 文件頭部應進行注釋,注釋需要列出:版權說明、版本號、生成日期、作者姓名、工號、內容、功能說明、與其他文件的關系、修改日志等,頭文件的注釋中還應有函數功能的說明。
  • 函數聲明處注釋描述函數功能、性能及用法,包括輸入和輸出參數、函數返回值、可重入的要求等;定義處詳細描述函數功能和實現要點,如實現的簡要步驟、實現的理由、設計約束等。
  • 全局變量要有詳細的注釋,包括對其功能、取值范圍以及存取時注意事項等的說明。
  • 盡量采用工具可以識別的格式注釋。

排版與格式

  • 程序塊采用縮進風格編寫,每級縮進為4個空格。
  • 相對獨立的程序塊之間、變量說明之后必須加空行。
  • 一行只寫一條語句。
  • 對等操作兩邊加空格,注釋符與內容之間加空格。

編譯

  • 使用編譯器的最高告警級別,理解所有的告警,通過修改代碼而不是降低告警級別來消除所有告警。
  • 在產品軟件中,要統一編譯開關、靜態檢查選項以及相應告警清除策略。

可測性

  • 模塊划分清晰,接口明確,耦合性小,有明確輸入和輸出,否則單元測試實施困難。
  • 在統一項目組或產品組內,調測打印的日志要有統一的規定。
  • 使用斷言記錄內部假設。
  • 不能用斷言來檢查運行時錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM