MISRS C 2004程式設計規範 重要知識點

2021-08-22 14:49:32 字數 3613 閱讀 5120

misrs c:2004程式設計規範:——重要知識點

misra c:2004建議程式中的**段不要被「注釋掉」。注釋掉**段很容易產生巢狀注釋,所以應該用條件編譯指令(如 #if 0…#endif)使相應的**段失效。

misra c:2004要求所有#pragma指令(預處理指令)的使用應該文件化並給予解釋。#pragma指令是由c標準規定的方法,用於給編譯器提供額外的資訊,提高了c源程式對編譯器的可移植性。

misra c:2004明確指出++和--運算子不得和其他運算子混合使用。邏輯運算子&& 和 || 的右運算元不得帶有***。

1、資料型別相關的編碼風格

(1)必須使用typedef顯示標識出各資料。不要直接使用char,int,float等基本資料型別。而應使用「特定長度」的typedef,顯示的指出資料型別的大小和符號。

(2)不得使用八進位制常數(0除外)或八進位制轉義符。(八進位制常數需要在最高位加數字0,容易造成誤解)

(3)簡單的char型別只可用於字元型別。

(4)signed char 和 unsigned char 型別只可用於數字值。

(5)位域只能被定義為unsigned int和signed int型別。

(6)unsigned int 型別的位域至少應該為2位長度。

2、資料型別的轉換

(1)對無符號字元型或無符號短整型進行~和《位運算後,其結果應立即強制轉換成運算元的基本型別。

(2)整型表示式中不允許出現以下情況的隱式資料型別轉換:

(3)浮點數表示式中不允許以下情況出現隱式資料型別轉換:

這兩個規則廣泛遵循以下原則:

有符號和無符號之間沒有隱式轉換

整型和浮點型別之間沒有隱式轉換

沒有從寬到窄的隱式轉換

函式引數沒有隱式轉換

函式的返回表示式沒有隱式轉換

複雜表示式沒有(不同型別)隱式轉換

(4)整型複雜表示式的值只能強制轉換到更窄的型別且表示式的基本型別具有相同的符號。

(5)浮點型別複雜表示式的值只能強制轉換到更窄的浮點數型別。

(6)字尾「u」應該用在所有unsigned 型別的常量上。

3、初始化規範

(1)自動變數在使用前都應被賦值。

(2)應該使用大括號以指示和匹配陣列和結構的非零初始化構造。

(3)在列舉列表中,「=」不能顯式用於除首元素之外的元素,除非所有元素都是顯式初始化的。

4、指標規範

1)指標的型別轉換

(1)指向不同資料型別的指標之間不能相互轉換。

(2)指標轉換過程中不允許丟失指標的const volatile屬性。

2)指標和陣列的運算

(1)只有指向陣列的指標才允許進行算數計算。(僅限於指標加減某個整數)

(2)只有指向同乙個陣列的兩個指標才允許相減。

(3)只有指向同乙個陣列的兩個指標才允許用》,>=,<,<=等關係運算子進行比較。

(4)只允許用陣列索引執行指標運算。

3)指標的有效性

(1)不允許將棧物件的位址傳給外部作用域的物件。

5、表示式規範

c語言標準規定的只是運算子的結合順序,而對於二元運算子兩邊的運算元的求值順序則未定義。意味著結果可能取決於編譯器的特性(從左向右解析還是從右向左解析)。

(1)表示式的值在標準所允許的任何運算次序下都應該是相同的。什麼時候不同呢?(當表示式中的運算元(表示式)能影響某個共享變數,而這個共享變數又有可能導致其餘運算元的值發生變化時,就需要對求值順序進行分析。

(2)應該減少表示式對c語言運算子優先順序的依賴性。應該用括號來保證運算順序。

(3)不允許將sizeof運算子作用於有***的表示式上。如:j = sizeof(i = 1234)實際上在運算時被替換為:j = sizeof(int32_t),因為sizeof運算子只針對資料型別進行操作。

(4)邏輯運算(&&和||)的右運算元不允許包含***。

(5)邏輯運算子的運算元必須是乙個主表示式。

(6)邏輯運算子(&&和||以及!)的運算元必須是乙個有效的布林值,布林值表示式不允許進行邏輯運算以外的操作。

(7)不允許對又符號數進行位操作。

(8)移位操作的右運算元只能在0和運算元的位數減1之間。

(9)不允許無符號性的表示式使用一元負運算子。

(10)不允許使用逗號表示式。

(11)不允許對浮點型值進行位操作。

(12)不允許在同乙個表示式中混合使用++和--。

6、程式流的控制規範

(1)禁止在產生布林值的表示式中使用賦值運算子。

(2)判斷乙個值是否為0應該是顯示的,除非運算元是乙個布林值。

(3)禁止對浮點數型別的變數或表示式做比較操作。

(4)for迴圈的控制表示式不應該包含浮點數型別。

(5)for迴圈語句的三個表示式應該僅與迴圈控制相關。

(6)禁止在迴圈中修改迴圈計數器。

(7)布林表示式的值必須是可改變的。

(8)非空的switch子句都應該以break語句結束。

(9)switch語句的主體必須是復合語句(即用大括號包含)

(10)switch的最後乙個子句必須是default子句,如果default中沒有包含任何語句,那麼應該使用注釋來說明為什麼沒有進行任何操作。

(11)switch的 表示式中不能出現有效的布林值型別。

(12)每乙個switch語句必須至少包含乙個case子句。

(13)不能存在無法執行的**。

(14)非空語句要麼必須產生***(side-effect)(***是指表示式執行後對程式執行環境造成的影響。賦值語句、自增操作等都是典型的具有***的操作),要麼使程式流程改變。

(15)一行中如果有空語句,那麼改行只能有這條空語句,不能有別的語句,並且在這條空語句前不能有注釋,注釋必須在其後,用空格隔開。

(16)不允許使用goto語句。

(17)不允許使用continue語句。

(18)迴圈體中最多只能出現乙個break語句用於結束迴圈。

(19)函式只能有乙個出口,這個出口必須在函式末尾。

(20)switch、while、do...while和for語句的主體必須是復合語句(即大括號包含),即使該主體只包含一條語句。

(21)if結構後面必須是乙個復合語句,else後面必須是乙個復合語句或者另乙個if語句。

(22)if.....else if 結構必須由乙個else子句結束。

7、函式相關規範

1)函式的定義和宣告

(1)函式的每乙個引數型別在宣告與定義中必須一致,函式的返回型別也應一致。

(2)標頭檔案中不允許包含物件或函式的定義。

(3)函式必須宣告原型,在函式定義和呼叫時原型必須可見。

(4)不允許定義引數數量不確定的函式。

(5)在函式的原型宣告中應該為所有引數給出識別符號。

(6)函式原型中的引數與實際定義中的形參必須一致。

(7)不帶引數的函式應該宣告為具有void型別的引數。

2)函式的呼叫和使用

(1)函式不得呼叫本身,無論是直接呼叫還是間接呼叫。(一般禁止使用遞迴或預估遞迴層數)

(2)傳遞給函式的引數個數必須與函式定義的引數一致。

(3)非void函式中每乙個return語句必須有返回值。

程式設計命名規範之 Google C 程式設計命名規範

大一的時候曾經特別關注過命名規範的問題,並且寫了乙個部落格總結了一些基礎的規範 三種程式設計命名規範 後來得知有一種命名規範叫做 go ogle c goo glec 命名規範的時候,特意看了一下,但是特別反感,感覺太糟糕了,所以就沒有深究過 我討厭壓行,這是我反感這個規範的最大原因。不過,現在我不...

SQL程式設計規範

一 sql書寫規範 二 書寫優化效能建議 三 其他經驗性規則 一 sql書寫規範 1 sql語句的所有表名 欄位名全部小寫,系統保留字 內建函式名 sql保留字大寫。2 連線符or in and 以及 等前後加上乙個空格。3 對較為複雜的sql語句加上注釋,說明演算法 功能。注釋風格 注釋單獨成行 ...

程式設計規範(記住!)

下面都清楚嗎?陣列 指標陣列 函式指標陣列 指標 陣列指標 指標 函式指標 規則1 2 1 為了防止標頭檔案被重複引用,用ifndef define endif 結構產生預處理塊。建議1 2 2 標頭檔案中只存放 宣告 而不存放 定義 即不要在標頭檔案定義變數等 建議1 2 3 對於全域性變數,在c...