【连载】【FPGA黑金开发板】NIOS II那些事儿--编程风格(三)
聲明:本文為XiaomaGee編寫,版權(quán)由XiaomaCee和本博文作者所有,如需轉(zhuǎn)載請標(biāo)明出處http://www.cnblogs.com/kingst
一、 規(guī)范參照標(biāo)準(zhǔn)
良好的代碼風(fēng)格及編程規(guī)范,是書寫優(yōu)良代碼的基礎(chǔ),也是工程師必備的技能。本規(guī)范遵循C語言的創(chuàng)始人B.W.Kernighan和D.M.Ritchit (簡稱 K & R)所著的《The C Programming Language》一書的示例,并參照 Linux 內(nèi)核代碼風(fēng)格。
本規(guī)范適用于有一定c語言基礎(chǔ)的讀者,對于需要入門的,建議熟讀幾遍《The C Programming Language》。另外本規(guī)范部分內(nèi)容僅適用于基于單片機(jī)、arm等嵌入式處理器的固件開發(fā)。
二、 格式
1. 縮進(jìn)
函數(shù)體、if、for、while、switch case、do while等都需要使用縮進(jìn)。不管你用任何編輯器或者是集成開發(fā)環(huán)境,縮進(jìn)均是基于“Tab”鍵的,而不是基于“空格”鍵。一般來說,我采用 8 個字符的縮進(jìn)長度。例如:
2. 空格及空行
空格和空行的出現(xiàn),是以增強(qiáng)程序的可讀性為目的。但是不要插入過多(兩個以上)的空格和空行。函數(shù)開始局部變量聲明后需加一個空行,函數(shù)內(nèi)邏輯相對獨立的部分,需加一個空行。文件結(jié)尾需加一個空行。
代碼中加入空格是以程序邏輯清晰為目的。c關(guān)鍵字后需加空格,例如:
3. 大括號
函數(shù)的大括號位于函數(shù)體的第二行與末行,if、while、switch、do的大括號位于關(guān)鍵字所在行的行尾和邏輯末行,末行的大括號與關(guān)鍵字上下對齊。例如:
三、 元素及命名規(guī)則
1. 文件
C語言源文件主要包括 .c文件和 .h 文件。文件命名要以體現(xiàn)其意義的名詞為主,例如芯片 max525的驅(qū)動程序,我們可以命名為 max525.c;實現(xiàn)fat32協(xié)議的驅(qū)動,我們可以命名為 fat32.c;忌出現(xiàn) a.c、newfile.c、my.c、wang.c等無意義文件名。
文件名用小寫字母、下劃線、數(shù)字的組合命名,不可出現(xiàn)空格等其他字符,更不允許出現(xiàn)漢字、日語、俄語等非 ascii碼的字符。
每個 .c文件都要對應(yīng)有一個 .h 文件來配合其對外資源聲明。 .h 文件內(nèi)可包含宏定義、類型定義、對外資源(全局變量、全局函數(shù))聲明。 .c 文件可以包含變量聲明、函數(shù)原型、函數(shù)體。為了防止重復(fù)調(diào)用,.h文件的邏輯開頭需要加入開關(guān)控制,例如:
2. 宏、枚舉體
宏、枚舉體均需用大寫字母、數(shù)字及下劃線的組合,宏與常量之間用“tab”隔離,同一類含義的宏定義在一起,并放于相關(guān)的頭文件中。宏定義以能表達(dá)清楚含義為標(biāo)準(zhǔn),除專業(yè)術(shù)語外,推薦用完整單詞表示宏含義。不同含義的宏定義需用空行分割,部分需加注釋。例如:
3. 自定義類型
我們可以用c關(guān)鍵字 typedef 進(jìn)行自定義c語言中的數(shù)據(jù)類型。類型定義一般包括結(jié)構(gòu)體、聯(lián)合體類型定義及函數(shù)類型定義。ANSI C包含的數(shù)據(jù)類型(如unsigned char、unsigned short int、double 等),不建議重定義。
結(jié)構(gòu)體、聯(lián)合體類型定義推薦大寫字母加 _T 的形式出現(xiàn),例如:
4. 函數(shù)聲明及實體
函數(shù)命名采用謂賓結(jié)構(gòu),中間用下劃線隔開,函數(shù)必須使用小寫、數(shù)字及下劃線的組合。不管函數(shù)原型聲明還是函數(shù)體,必須包含完整的函數(shù)類型及參數(shù)類型(包括 void型亦不能省略)。文件的內(nèi)部函數(shù)(不需要外部調(diào)用),需要在函數(shù)類型前加static 關(guān)鍵字。
函數(shù)原型聲明時,需用注釋的方式,添加函數(shù)調(diào)用參數(shù)的意義,例如:
大部分函數(shù)需返回函數(shù)執(zhí)行狀態(tài),定義 0 為正常執(zhí)行, -1為一般錯誤,-1 ~ -999為自定義錯誤。自定義錯誤可以通過宏或者變量實現(xiàn)。例如:
從邏輯功能劃分的角度來講,函數(shù)需要簡、短、精,函數(shù)實現(xiàn)的邏輯內(nèi)容要跟函數(shù)名要一一對應(yīng),不要超過函數(shù)名表達(dá)的范圍,也不要只實現(xiàn)函數(shù)名所表達(dá)的部分功能。一般情況,盡量調(diào)用系統(tǒng)庫來實現(xiàn)功能而不是自己去實現(xiàn)。
5. 變量及初始化
變量一律用小寫字母、數(shù)字及下劃線實現(xiàn),全局變量要體現(xiàn)變量的意義,需用單詞的全寫; 由于局部變量作用的范圍,一般都在視野范圍你,所以可以用簡寫及單個字母,如 i、a等。
全局變量盡量越少越好,并且需根據(jù)屬性劃分,以結(jié)構(gòu)體形式體現(xiàn)為主。整個工程的全局變量需在頭文件中用 extern 關(guān)鍵字對外聲明,隸屬于文件的全局變量(不屬于整個工程的全局變量),需加 static 關(guān)鍵字修飾。
變量使用前必須初始化,初始化可以采用靜態(tài)初始化和函數(shù)執(zhí)行時初始化。結(jié)構(gòu)體的初始化建議采用 c99 規(guī)范里的指定初始化。例如:
數(shù)組維數(shù)最好用宏定義,數(shù)組用時必須初始化(賦值或者清零),對數(shù)組維數(shù)判斷時,需用sizeof 關(guān)鍵字,切忌直接用數(shù)字。
使用指針時,切忌指針越界及野指針的出現(xiàn);指針也是個變量,用它之前也必須初始化。對CPU外設(shè)進(jìn)行直接映射或者是中斷內(nèi)變量使用時,變量前需加 volatile 以防系統(tǒng)優(yōu)化。
6. 注釋
注釋不宜過少,但也不宜過多。以表達(dá)清楚程序員的意圖為最終目的,注釋盡量不要用中文。函數(shù)體內(nèi)注釋,推薦采用 “//” 的注釋方式。
每個文件頭,均需加一個說明性的注釋。例如:
每個函數(shù)體的開始,均需加一個說明性的注釋。例如:
四、 項目管理
1. 項目文件夾
每個C工程中,可以以功能為依據(jù)對源文件進(jìn)行文件夾分類。文件夾不可以出現(xiàn)空格、除英文字母、數(shù)字、下劃線外的字符;更不允許出現(xiàn)漢字、俄語等非 ASCII碼字符。例如某個工程可以劃分為如下文件夾:
2. 功能劃分
功能劃分應(yīng)以邏輯清晰、層次關(guān)系明顯為目的。一旦劃分好后,不可越級調(diào)用系統(tǒng)資源(例如只有driver內(nèi)文件內(nèi)直接操作硬件資源,其他文件夾代碼均不可調(diào)用最底層硬件資源)。也不要互相調(diào)用而使系統(tǒng)資源很快耗盡。
3. 文件管理
文件一旦建立,就需在文件頭說明文件目的、版權(quán)及歷史記錄,每次修改后必須記錄。工程完工或者是間歇性擱置時,需要對所有工程文件夾、文件進(jìn)行只讀屬性設(shè)置及當(dāng)前狀態(tài)記錄(進(jìn)行到什么狀態(tài)、存在什么bug等)。對源代碼最好做到每天一備份,以防意外篡改及丟失,以備恢復(fù)之用。
五、 一些建議
1. 代碼編輯器
有很多優(yōu)秀的代碼編輯器可供大家選擇,例如 Vim、Emacs、Souce-Insight、Edit-Plus等。每個人可以根據(jù)自己的喜好,選擇一種編輯器,切忌濫用。
2. PC 端編譯器及集成開發(fā)環(huán)境
GCC (GNU Compiler Collection) 是一個非常優(yōu)秀的編譯器套裝。他幾乎在所有的操作系統(tǒng)下均有移植,并且有很多CPU的交叉編譯器可供我們使用,例如 SDCC、arm-elf-gcc等。MS-Windows下推薦使用 Mingw32移植版,相應(yīng)的集成開發(fā)環(huán)境推薦 Dev-cpp 和 Code::block。
3. 參考資源及網(wǎng)站
《The C Programming Language》 c語言圣經(jīng);
《Advanced Programming in the UNIX Environment》 UNIX C 程序員圣經(jīng);
http://www.gnu.org GNU Operating System
http://www.sf.net Source Forge
http://www.kernel.net The Linux Kernel Archives
六、 示例代碼
1. c文件
2. 頭文件
總結(jié)
以上是生活随笔為你收集整理的【连载】【FPGA黑金开发板】NIOS II那些事儿--编程风格(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qooxdoo学习笔记一
- 下一篇: WordPress中J.parentNo