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,
};