文/mike
往往我們做微控制器程式開發的時候,很少去注意程式的架構和命名規範,然而只要是涉及到**開發,這都是不可迴避的問題,很多小公司做嵌入式的開發,在技術上沒有傳承性,專案總是因人而異。很多較大型的**寫到最後總是捂不住各種冒出來的bug,其實最大的問題是根基沒有打牢。當然,主要是程式架構的問題,架構的清晰性,程式的可讀性,可維護性,模組化都是需要設計和約定的。複雜的事,困難的事都是可以分解為簡單的小事的。函式命名, 變數命名, 檔案命名要有描述性,少用縮寫。本文件,簡要約定c/c++的相關命名規範,參照了《google開源專案風格指南》,然而文件全面的而龐雜的命名規則,很容易讓人記不住,其實在嵌入式開發的過程中,我們只需要記住幾個最核心的,**風格就會立馬轉變。用20%的內容可以提高80%的**質量。主要是變數命名、結構體命名、檔案命名、函式命名、列舉命名等。
盡可能使用描述性的命名, 別心疼空間, 畢竟相比之下讓**易於新讀者理解更重要. 不要用只有專案開發者能理解的縮寫, 也不要通過砍掉幾個字母來縮寫單詞。
int price_count_reader; // 無縮寫
int num_errors; // "num" 是乙個常見的寫法
int num_dns_connections; // 人人都知道 "dns" 是什麼
int n; // 毫無意義.
int nerr; // 含糊不清的縮寫.
int n_comp_conns; // 含糊不清的縮寫.
int wgc_connections; // 只有貴團隊知道是什麼意思.
int pc_reader; // "pc" 有太多可能的解釋了.
int cstmr_id; // 刪減了若干字母.
檔名要全部小寫, 可以包含下劃線 。
my_useful_class.cc
my-useful-class.cc
myusefulclass.cc
myusefulclass_test.cc // _unittest 和 _regtest 已棄用.
c++ 檔案要以 .cc 結尾, 標頭檔案以 .h 結尾. 專門插入文字的檔案則以 .inc 結尾, 參見 標頭檔案自足.
不要使用已經存在於 /usr/include 下的檔名 (yang.y 注: 即編譯器搜尋系統標頭檔案的路徑), 如 db.h.
通常應盡量讓檔名更加明確. http_server_logs.h 就比 logs.h 要好. 定義類時檔名一般成對出現, 如 foo_bar.h 和 foo_bar.cc, 對應於類 foobar.
內聯函式必須放在 .h 檔案中. 如果內聯函式比較短, 就直接放在 .h 中.
變數 (包括函式引數) 和資料成員名一律小寫, 單詞之間用下劃線連線. 類的成員變數以下劃線結尾, 但結構體的就不用, 如:
a_local_variable, a_struct_data_member, a_class_data_member_.
舉例:
string table_name; // 好 - 用下劃線.
string tablename; // 好 - 全小寫.
string tablename; // 差 - 混合大小寫
不管是靜態的還是非靜態的, 類資料成員都可以和普通變數一樣, 但要接下劃線.
class tableinfo ;
不管是靜態的還是非靜態的, 結構體資料成員都可以和普通變數一樣, 不用像類那樣接下劃線:
struct urltableproperties ;
結構體與類的使用討論, 參考 結構體 vs. 類.
宣告為 constexpr 或 const 的變數, 或在程式執行期間其值始終保持不變的, 命名時以 「k」 開頭, 大小寫混合. 例如:
const int kdaysinaweek = 7;
所有具有靜態儲存型別的變數 (例如靜態變數或全域性變數, 參見 儲存型別) 都應當以此方式命名. 對於其他儲存型別的變數, 如自動變數等, 這條規則是可選的. 如果不採用這條規則, 就按照一般的變數命名規則.
常規函式使用大小寫混合, 取值和設值函式則要求與變數名匹配:
myexcitingfunction(),
myexcitingmethod(),
my_exciting_member_variable(),
set_my_exciting_member_variable().
一般來說, 函式名的每個單詞首字母大寫 (即 「駝峰變數名」 或 「帕斯卡變數名」), 沒有下劃線. 對於首字母縮寫的單詞, 更傾向於將它們視作乙個單詞進行首字母大寫 (例如, 寫作startrpc()
而非startrpc()
).
addtableentry()
deleteurl()
openfileordie()
(同樣的命名規則同時適用於類作用域與命名空間作用域的常量, 因為它們是作為 api 的一部分暴露對外的, 因此應當讓它們看起來像是乙個函式, 因為在這時, 它們實際上是乙個物件而非函式的這一事實對外不過是乙個無關緊要的實現細節.)
取值和設值函式的命名與變數一致. 一般來說它們的名稱與實際的成員變數對應, 但並不強制要求. 例如int count()
與void set_count(int count)
.
列舉的命名應當和 常量 或 巨集 一致: kenumname 或是 enum_name.
單獨的列舉值應該優先採用 常量 的命名方式. 但 巨集 方式的命名也可以接受. 列舉名urltableerrors (以及 alternateurltableerrors)
是型別, 所以要用大小寫混合的方式.
enum urltableerrors ;
enum alternateurltableerrors ;
2009 年 1 月之前, 我們一直建議採用 巨集 的方式命名列舉值. 由於列舉值和巨集之間的命名衝突, 直接導致了很多問題. 由此, 這裡改為優先選擇常量風格的命名方式. 新**應該盡可能優先使用常量風格. 但是老**沒必要切換到常量風格, 除非巨集風格確實會產生編譯期問題.
你並不打算 使用巨集, 對吧? 如果你一定要用, 像這樣命名:my_macro_that_scares_small_children
.
參考 預處理巨集; 通常 不應該 使用巨集. 如果不得不用, 其命名像列舉命名一樣全部大寫, 使用下劃線:
#define round(x) ...
#define pi_rounded 3.0
更多程式風格和命名規範請移步google開源專案風格指南
針對第一結裡面提到的命名規則,總結一下,記住下面的幾句話就好了:
檔案和變數命名全小寫,結構體變數統一小寫加 _
函式命名首字母大寫(駝峰命名);
列舉名駝峰命名,列舉值統一大寫;
嵌入式開發
經常會有人說嵌入式開發,嵌入式開發千差萬別,我總體上分為4個等級 微電子開發 rtos開發 指令碼開發 富應用開發 這一類產品行為比較固定,比如說電視遙控器,遙控汽車,電飯煲,恆溫燒水壺,溫濕度感測器,智慧型門鎖等。這些裝置行為都比較簡單,通過按鈕可以設定系統功能和行為。量不大,經常會選用flash...
初識嵌入式 嵌入式開發概述
1 什麼是嵌入式技術 1 嵌入式軟體與非嵌入式軟體的區別?答 嵌入式軟體是結合作業系統之上做的開發 非嵌入式軟體是做的裸機開發。裸機 沒有作業系統 2 嵌入式開發與微控制器開發的區別?答 區別 是否有作業系統。拓展 答 優點 解決了軟體的移植性 解決了開發人員的能力的劃分問題。提供了豐富的網路協議 ...
嵌入式開發FAQ
a 嵌入式開發難嗎?q 難者不會,會者不難。a 嵌入式開發如何入門?a 嵌入式開發如何深入?q 其實一旦你對嵌入式開發整套流程熟悉以後,很多人覺得嵌入式開發跟一般的開發沒有什麼兩樣,都是體力活。其實你還只了解了皮毛,還未深入了解或者理解嵌入式開發。很多人進入這個行業,是因為這個行業薪水較高,進入以後...