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