编程规范
一:头文件是模块( Module)或单元( Unit)的对外接口
二:命名规则
1: 对分支语句(条件分支、循环语句等)必须编写注释
2:使用一致的前缀来区分变量的作用域。
3: 使用一致的小写类型指示符作为前缀来区分变量的类型
变量活动范围前缀规范如下:
g_ : 全局变量
s_ : 模块内静态变量
空 : 局部变量不加范围前缀
4: 完整的变量名应由前缀+变量名主体组成,变量名的主体应当使用“名词”或者“形容词+名词”,且首字母必须大写。
float g_fValue; //类型为浮点数的全局变量
char *pcOldChar; //类型为字符指针的局部变量
5: 函数名用大写字母开头的单词组合而成,且应当使用“动词”或者“动词+名词”(动宾词组)。
6:结构名、联合名、枚举名由前缀T_ 开头
7:事件名由前缀EV_ 开头
8:使用一致的小写类型指示符作为前缀来区分变量的类型。
i :int
f :float
d :double
c :char
uc :unsigned char 或 BYTE
l :long
p :pointer
b :BOOL
h :HANDLE
w :unsigned short 或 WORD
dw :DWORD或unsigned long
a : 数组,array of TYPE
str : 字符串
t : 结构类型
三:变量、常量和类型
1:定义全局变量时必须仔细分析,明确其含义、作用、取值范围及与其它全局变量间的关系。
2:一个变量有且只有一个功能,不能把一个变量用作多种用途。
3:宏定义中如果包含表达式或变量,表达式和变量必须用小括号括起来
4:尽量使用const说明常量数据,对于宏定义的常数,必须指出其类型。
5:使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。
说明:使用统一的自定义数据类型,有利于程序的移植。
自定义数据类型 | 类型说明 | 类型定义(以Win32为例) |
VOID | 空类型 | void |
BOOLEAN | 逻辑类型 (TRUE或FALSE) | unsigned char |
BYTE/ UCHAR | 无符号 8 位整数 | unsigned char |
CHAR | 有符号 8 位整数 | signed char |
WORD16/ WORD | 无符号 16 位整数 | unsigned short |
SWORD16/SHORT | 有符号 16 位整数 | signed short |
WORD32/DWORD | 无符号 32 位整数 | unsigned int |
SWORD32/INT/LONG | 有符号 32 位整数 | signed int |
FP32/FLOAT | 32 位单精度符点数 | float |
FP64/DOUBLE | 64 位双精度符点数 | double |
四:表达式和语句
1:一条语句只完成一个功能。
2:不可将布尔变量和逻辑表达式直接与TRUE、FALSE或者1、0进行比较。
3:不可将浮点变量用“==”或“!=”与任何数字比较。
4:应当将指针变量用“==”或“!=”与NULL比较。
5: 在进行“==”比较时,将常量或常数放在“==”号的左边。
五:函数与过程
1:如果函数没有参数,则用void填充。
2:如果参数是指针,且仅作输入用,则应在类型前加const。
3:对于有返回值的函数,每一个分支都必须有返回值。
4:如果返回值表示函数运行是否正常,规定0为正常退出,不同非0值标识不同异常退出。避免使用TRUE或FALSE作为返回值。
六:可靠性
1:指针类型变量必须初始化为NULL