C語言編碼規範——着重注意點整理
編碼規範的目的:
保證不同背景和經歷的開發同學可以良好的協同開發
保證組織級的開發技能和經驗得以共享和傳承
編程最難的是命名!因爲其他的算法、數據結構都有據可循。
命名完全體現了程序的可閱讀性和可理解性。
1、 變量命名規範
(1) 變量命名
以字母或下劃線開頭,大小寫字母和下劃線交錯命名。
(2) 前綴
靜態變量 s_
全局變量 g_
指針變量 p_
無符號 u_
數組 a_
函數指針 pf_
枚舉變量 en_
結構體 st_
VOID v_
32位系統下:
signed int縮寫爲INT或者INT32
unsigned int縮寫爲UINT或者UINT32。
BOOL b_XXX;
CHAR c_XXX;
UCHAR uc_XXX;
SHORT s_XXX;
USHORT us_XXX;
INT i_XXX;
UINT ui_XXX;
LONG l_XXX;
ULONG ul_XXX;
2、 宏定義
宏定義的命名:字母全部大寫並以下劃線進行分割。
宏定義是預處理時進行簡單的字符替換。
宏定義沒有類型,而且宏定義不分配內存。
3、 類型後綴
結構體以_S結尾:
typedef struct XXX { .... }XXX_S;
附:結構的封裝一定要合理,好好利用字節對齊問題,減少空間的浪費。
枚舉以_E結尾:
typedef enum XXX
{
....
}XXX_E;
聯合體以_U結尾:
typedef union XXX
{
....
}XXX_U;
函數指針以_PF結尾。
4、 函數
命名規範:模塊名_功能(模塊字母大寫,功能字母大小寫交錯)
函數入參可以加上IN/OUT/INOUT。
注意:
函數務必檢查入參的合法性
儘量設計高扇入、合理扇出(<7)的函數。
(扇出即是調用其他函數的個數,扇入即被調用次數)
5、 文件名
文件名全小寫,命名規範“模塊名_功能名.文件後綴”
6、 換行/命名的縮寫/代碼對齊/字符間空白
7、 註釋
只能使用/* */。
8、 日誌打印
(1) 打印什麼?
基本包括文件名、函數名、行號、錯誤原因、變量值等。
(2) 日誌分級
DEBUG/TRACE——精確記錄一些用於調試的log。
INFO——一般記錄正常運行流程和狀態記錄。
WARN——警告,可能會出現問題的地方。
ERROR/FATAL——重點記錄的錯誤,詳細記錄失敗的場景、失敗原因、一些關鍵變量值等。
9、 其他——編碼安全注意點及編碼效率
(1) 編碼效率:全局效率、局部效率、時間效率、空間效率
注意編程中的時間和空間轉換的問題,以此提高效率。
(2) 禁止使用goto語句。
(3) If else語句的嵌套儘量不超過三層。
(4) 儘量避免循環中continue、break的一起使用問題。
(5) 務必進行入參檢查和申請內存的變量的釋放問題。
指針的操作:
#使用前,進行合法性檢查
ptr = malloc(size);
if(NULL == ptr)
{
//處理語句;
}
else
{
//處理語句;
}
#使用完指針ptr,進行釋放和指針置空
free(ptr);
ptr = NULL;
指針使用前,進行合法性檢查(判空處理),指針使用後,釋放申請的空間且指針置空。(6) 代碼複雜度的度量和控制,提高軟件的可維護性。
(7) 減少CPU的切換次數,將最忙的循環放在內層。
(8) 循環中,合理放置判斷語句,減少判斷次數。
(9) 判斷風格,if(value == variable),if(NULL == ptr)
務必注意:判斷是否可能恆爲真、恆爲假的問題!!!
(10)避免類型的隱式轉換,全部進行顯示類型轉換。
(11)圈複雜度一般控制在<10,必須<15。