C語言編程規範

 

【規則2-1-6】不允許在頭文件中定義變量。

說明:

在頭文件中定義的變量,在該頭文件被多個源文件包含後,相當於在不同源文件中分別被定義。如果該變量是全局變量,最終編譯器在鏈接時會因爲出現重複的符號而出錯。

【建議2-1-1】頭文件應該自包含(self-contained)。

說明:

所有頭文件要能夠自給自足。換言之,用戶和重構工具不需要爲特別場合而包含額外的頭文件。

【建議2-1-2】只有當函數只有10行甚至更少時纔將其定義爲內聯函數。

說明:

當函數被聲明爲內聯函數之後, 編譯器會將其內聯展開, 而不是按通常的函數調用機制進行調用.只要內聯的函數體較小, 內聯該函數可以令目標代碼更加高效. 對於存取函數以及其它函數體比較短, 性能關鍵的函數, 鼓勵使用內聯。

【建議2-1-3】儘可能地避免使用前置聲明,應使用 #include 包含需要的頭文件。

說明:

儘可能地避免使用前置聲明。可使用 #include 包含需要的頭文件。 缺點:

  • 前置聲明隱藏了依賴關係,頭文件改動時,用戶的代碼會跳過必要的重新編譯過程。
  • 前置聲明可能會被庫的後續更改所破壞。前置聲明函數或模板有時會妨礙頭文件開發者變動其 API. 例如擴大形參類型,加個自帶默認參數的模板形參等等。
  • 前置聲明來自命名空間 std:: 的 symbol 時,其行爲未定義。
  • 很難判斷什麼時候該用前置聲明,什麼時候該用 #include 。極端情況下,用前置聲明代替 includes 甚至都會暗暗地改變代碼的含義。

reference(C++前置聲明介紹):

https://blog.csdn.net/leo_888/article/details/81124144

https://blog.csdn.net/qingzhuyuxian/article/details/92157301

【規則2-1-4】 代碼入庫之前,先通過代碼格式化工具處理再合入。

說明:

代碼格式化工具能夠自動處理TAB、對齊、括號、換行等規則,保持代碼的美觀和統一,相關的工具有indentastyleuncrustify等。

【規則2-2-3】定義指針類型的變量,*應放在變量前。

正例:

c float *pfBuffer;

反例:

c float* pfBuffer;

**【建議2-2-4】如果一個布爾表達式超過標準行寬, 斷行方式要統一。 **

說明:

邏輯與 (&&) 、邏輯或 (||) 操作符均位於開頭。 可以考慮額外插入圓括號, 合理使用的話對增強可讀性是很有幫助的。

**【建議2-2-6】空行越少越好(程序實體之間有且僅有一行空行區分,每個文件末尾都應該有且僅有一行空行)。 **

說明:

這不僅僅是規則而是原則問題了:不在萬不得已,不要使用空行。尤其是:兩個函數定義之間的空行不要超過 2 行,函數體首尾不要留空行,函數體中也不要隨意添加空行;不同邏輯程序塊之間要使用空行分隔。 基本原則是:同一屏可以顯示的代碼越多,越容易理解程序的控制流。當然,過於密集的代碼塊和過於疏鬆的代碼塊同樣難看,這取決於你的判斷。但通常是空行越少越好。下面的規則可以讓加入的空行更有效: 函數體內開頭或結尾的空行可讀性微乎其微。在多重 if-else 塊里加空行或許有點可讀性。

**【建議2-2-7】不要在 return 表達式里加上非必須的圓括號。 **

說明:

【建議2-2-8】不推薦使用問號表達式(?);如使用的話,則前後應該有一個空格。

說明:

【規則2-3-4】結構型的數組、多維的數組如果在定義時初始化,按照數組的矩陣結構分行書寫。必須全部人工賦初值,編譯器不一定會缺省賦初值。

正例:

c int aiNumbers[4][3] = { 1, 1, 1,

                 2, 4, 8,

                 3, 9, 27,

                 4, 16, 64 }

 

【規則5-1-3】宏定義中如果包含表達式或變量,表達式和變量必須用小括號括起來。

說明:

在宏定義中,對表達式和變量使用括號,可以避免可能發生的計算錯誤。

正例:

#define  HANDLE(A, B)   (( A ) / ( B ))

反例:

#define  HANDLE(A, B)   (A / B)

【規則5-1-6】書寫數字時不要在前面添0,否則就成爲8進制數。

說明:

例如 063 = (63)8 = (51)10。

【規則5-1-7】全局變量必須定義在源文件中,不允許定義在頭文件中。

說明:

全局變量被定義在頭文件中,如果頭文件一旦被包含,包含該頭文件的地方就會在Memory中生成無用的內容,浪費Memory空間,因此不允許在頭文件中使用。

【規則5-1-11】定義全局變量時須進行初始化。

說明:

在C語言裏,全局變量如果不初始化的話,默認爲0,也就是說在全局空間裏:int x =0; 跟 int x; 的效果看起來是一樣的。但其實這裏面的差別很大,他們的主要差別如下: 編譯器在編譯的時候針對這兩種情況會產生兩種符號放在目標文件的符號表中,已初始化的變量叫強符號變量,未初始化的變量叫弱符號變量。 連接器在連接目標文件的時候,如果遇到兩個重名符號變量,會有以下處理規則: 1、如果有多個重名的強符號變量,則報錯。 2、如果有一個強符號變量,多個弱符號變量,則以強符號變量爲準。 3、如果沒有強符號變量,但有多個重名的弱符號變量,則任選一個弱符號變量。 所以,如不初始化就可能會出現意想不到的錯誤。

 

發佈了143 篇原創文章 · 獲贊 58 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章