MISRA C指導指南解讀系列4(MISRA C規則20-32)

 

2.1.            聲明和定義

20.所有的對象和函數標識符在使用前必須聲明(R)

21.內部標識符不能與外部標識符具有相同的名稱,從而隱藏的外部標識符(R)

       例如

       static int a;

       int myfunc(void) {

              int a; /* 違反該規則 */

}

22.對象的聲明應該在函數範圍內,除非必須要更廣的範圍(A)

       也就是儘量少用全局變量

23.如果可能,針對文件範圍的聲明必須是static屬性(A

24.在相同的轉換單元中,標識符在同一個轉換單元中不能同時具有內部和外部鏈接(R

例如

static int a;

void myfunc(void)

{

       extern int a;      /* 這個是可以的 */

       static int b;

       {

              extern int b;  /* 與規則衝突 */

}

}

25.具有外部鏈接的標識符應該具有準確的外部聲明(R

26.如果對象的聲明超過一次,那麼應該具有一致的聲明(R)

27.外部對象不能在多個文件中進行聲明(A)

28.不能使用寄存器存儲對象聲明(A

       也就是避免定義

              register int a;

29.名稱的使用應該和聲明一致(R

       例如

              struct myStruct {

              int myMember;

}

 

struct myStruct ok = {1};

struct myStruct error = {“1”};

2.2.            初始化

       30.所有自動變量在使用之前都要賦值(R

       31.在對數組和結構體的非零初始化時,應該使用大括號用來表明和匹配相應結構(R

32.在枚舉中,”=”結構是不允許用來初始化成員變量的,除非是是僅僅是第一個成員或者是所有成員(R),例如

enum TEST { /* 違反規則 32*/

     X=5,

     Y,

     Z=9,

 };

 

 enum TEST2 { /*違反規則 32*/

 

     X2,

     Y2=5,

     Z2,

 };

 

 enum TEST3 { /*Ok*/

     X3,

     Y3,

     Z3,

 };

 

 enum TEST4 { /*Ok*/

     X4=2,

     Y4,

     Z4,

 };

 

 enum TEST5 { /*Ok*/

 

     X5=2,

     Y5=4,

     Z5=8,

 };

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章