講嵌入式C語言編碼風格
目 錄 簡介及說明 語言規則 1.基礎 2.數據 3.說明與表達式 4.函數 5.內存及資源 6.源文件 風格指導 7.程序書寫 8.命名 9.文檔 簡介及說明 正確性 易維護性 易移植性 代碼的高效性 語言規則——基礎 編寫清晰表達設計思路和意圖的代碼 針對易讀來優化代碼, 效率優化留給編譯器去做 編寫可大聲朗讀的代碼 利用注釋闡述和解釋代碼,并進行總結 使用有意義且無歧義的命名方法.(推薦使用全英文的命名) 盡可能使用標準C 函數 不將同樣的代碼使用三次以上, 編寫相應的函數 讓程序自己檢查運行中的錯誤-編寫調試代碼 謹慎使用GOTO語句 不要修補那些風格差的代碼,重寫他們 不要比較兩個浮點數是否相等 優化代碼或調試一舊版本前,備份并記錄所做的修改 避免機器及編譯器相關的代碼,如必需,隔離相關代碼 將編譯器設為最高警告水平,把每一個警告視為錯誤來處理 不要直接在程序中直接書寫常量,應該使用常量的宏定義 #include 的頭文件沒有被引用 在同一個編譯單元內(一般是一C文件)重復引用同一頭文件 在頭文件內說明卻僅僅在一個C文件中引用 全局變量僅僅在一個C文件中引用. (應該使用static 量) 在賦值中,左右兩邊的數據類型不一樣. (如確實必須,應該顯式地進行類型轉換) 函數返回指向函數內說明的自動變量的指針. (應該使用指向static 變量的指針) 刪除switch case 語句中的break語句(除非兩個或多個case的處理代碼是完全一致的, 這時應該加以注釋。) 兩個不同類型指針間的運算 隱含的數據類型轉換 隱含的對于變量是否為0的測試 比如: “if (a = b)” ; 正確的寫法是 “if ( (a = b ) != 0)” 缺少default 的switch 語句 表達式中假設了運算順序 (不要怕寫括號) 忽略函數的返回值, 如果函數不需要返回值可使用 (void) f(); 但如果程序中無 返回值函數的數量太多,則系統的設計可能有問題 模塊間的依賴關系對于開發效率,可測性,可維護性都有很大的影響. 良好的依賴關系應該是簡單的,層次化的,和非循環的. 函數間傳遞的參數越少越好,減少模塊件的依賴關系和耦合程度,最大程度上實現對模塊的封裝,將模塊內的復雜性屏蔽,而對外提供簡潔的數據接口。 盡量減少全局變量的使用,局限在一個c文件中的全局變量應該說明為 static。 對于一組在邏輯上相關的變量,應該盡量將他們封裝在結構中。 推薦使用 typedef 來進行數據類型的說明。 所有不同類型變量間的運算,必須顯式地進行類型轉換。(這一點對于不同類型的指針間運算尤其重要) 對于沒有加 unsigned 修飾的類型, 應該小心處理可能的數據溢出 在程序( 函數或c文件 )的開始處對變量進行說明, 將相關的變量說明放在相鄰的行 變量的說明應該遵循一個變量一行的原則, 除非所說明的變量是緊密相關的 將不變的變量說明為 const 盡量在變量的說明行中對變量進行初始化 避免不必要的全局變量 什么時候使用指針? 該變量在其有效期內可能表示不同的對象. 該變量表示一個任意的關系, 也即其可能為空. 使用指針可能有更高的效率(關鍵代碼中)或更好的實現 避免無效的指針 假設任何指針都可能為空 使用NULL來比較指針,而不是0,僅有指針才會擁有NULL值 使用NULL 來表示指針不指向任何對象;使用 0x0 表示數值零; 使用 ’\0’表示字符串的結束. 只有在沒有更好的變通情況下使用GOTO 語句 確保數組的存取沒有越界 假設所有的臨時變量再使用完畢后就被立刻清除 所有函數的入口參數都必須進行合法性檢查 函數間的接口越簡潔越好, 參數傳遞應該盡可能的簡單 理想的函數應該僅有一個統一的返回點(出口) 對于某個具體的項目而言, 函數應該擁有盡量統一的返回值約定 函數的調用者應該檢查函數的返回值 過深層次的嵌套調用應該充分考慮系統或該進程的堆棧大小, 防止堆棧溢出 每個函數前必須有相應的說明 所有函數的返回類型必須顯式的定義, 沒有返回值的函數應該說明為void 函數前必須有相應的說明-范例 /********************************************************* *FUNCTION NAME :test_func * *ARGUMENT: *in_arg1: brief description of the argument *in_arg2: brief description of the argument *in_arg3: