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