一、命名规则
1、 变量:
● 程序员和编程员的区别局部变量:
格式:变量类型(小写字母简拼) + 描述变量功能的单词或拼音(首字母大写)。
例如: LONG lActiveIpCnt = 0 ; // 当前活动设备IP数量
PBYTE pReadBuffer = NULL ; // 读数据缓冲区
HANDLE hIniFile = INVALID_HANDLE_VALUE ; // 配置文件
● 全局变量:
格式: g_ + 局部变量名字
例如: LONG g_lActiveIpCnt = 0 ;
PBYTE g_pReadBuffer = NULL ;
HANDLE g_hIniFile = INVALID_HANDLE_VALUE ;
● 类成员变量:
格式::m_ + 局部变量名字
例如:LONG m_lActiveIpCnt ;
PBYTE m_pReadBuffer ;
HANDLE m_hIniFile ;
● 字符串
多个字符串名称以sz开头
例如:char szBuf[256];
● 结构成员变量:
格式: 同 局部变量
例如:
typedef struct _EDP_DEVICE_ADDR_INFO
{
ULONG uIpAddr ;
BYTE byMacAddr [EDP_MAC_LEN] ;
} EDP_DEVICE_ADDR_INFO, * LPEDP_DEVICE_ADDR_INFO ;
#define EDP_DEVICE_ADDR_INFO_LEN sizeof (EDP_DEVICE_ADDR_INFO)
● 变量 初始化
定义变量的同时完成初始化
● 指针变量
普通指针:p + 局部变量名字
长型指针:lp + 局部变量名字
2、 函数:
格式:描述函数功能的单词组合,单词首字母大写,其余小写。
例如:BOOL GetUserName (LPTSTR lpBuffer, LPDWORD pdwSize ) ;
3、 类:
格式:C (Class的标志,大写字母) + 类的描述性名称
例如:
class CScanManager
{
public:
CScanManager () ;
~ CScanManager () ;
} ;
4、 结构:
格式:typedef struct + _ (下划线) + 结构描述性名称(大写字母,单词间用下划线分割)
例如:
typedef struct _EDP_DEVICE_ADDR_INFO
{
ULONG uIpAddr ;
BYTE byMacAddr [EDP_MAC_LEN] ;
} EDP_DEVICE_ADDR_INFO, * LPEDP_DEVICE_ADDR_INFO ;
#define EDP_DEVICE_ADDR_INFO_LEN sizeof (EDP_DEVICE_ADDR_INFO)
EDP_DEVICE_ADDR_INFO daiDeviceAddrInfo = {0} ;
LPEDP_DEVICE_ADDR_INFO pDevAddrInfo = NULL ;
二、排版
1、新建文件要在文件开始出写明如下结构:
/*++
作者:
时间:
功能:
文件名称:
--*/
2、文件开始出用应当用ifndef/define/endif 结构产生预处理块。
3、用 #include <filename.h> 格式来引用标准库的头文件,用 #include “filename.h” 格式来引用非标准库的头文件。
4、在每个类声明之后、每个函数定义结束之后都要加空行,在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
5、变量尽量声明在文件开始处或者函数开始处,并且做到一块声明中变量对齐。
6、一行代码只做一件事情(定义一个变量),判断,循环语句各占一行,执行其他语句不仅跟其后,而判断,循环语句的执行语句有多少都要加{}。
7、代码行最大长度宜控制在70至80个字符以内。代码不要过长否则眼睛看不过来。长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可选。
8、if、for、while、do 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。
9、程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
10、应当将修饰符 * 和& 紧靠变量名。
11、尽可能在定义变量的同时初始化该变量。
12、指针声明的时候赋值为NULL,释放内存后要将指针赋值为NULL。在使用指针的时候尽量判断指针是否为空。
14、一个函数保证只有一个入口和出口。同时,要有log系统,分析bug之用。在函数中尽量不使用return语句,将return作为函数的唯一出口进行使用。
15、函数注释,在函数开始处,添加函数注释,格式如下:
/*++
作者:
时间:
描述:
参数:
返回值:
--*/
16、函数声明规范:参数要指明输入输出类型,用IN,OUT宏表示。
17、swithc语句中最后都要加上default,break这样的处理。
18、宏、enum变量应全部用大写表示。
19、驱动中申请内存要判断是否申请成功。对于有返回值的API调用都有判断返回值是否有效。以做出相应的错误处理。
20、对于布尔类型的变量进行判断是否为真,可以直接进行。其他整型的判断写成如下格式:值 == 变量,以数值为主。防止写错成赋值。
21、关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,
否则无法辨析关键字。象if、for、while 等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
22、函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
23、‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
24、赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
25、一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。象“[]”、“.”、“->”这类操作符前后不加空格。
26、对于表达式比较长的for 语句和if 语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d))。
27、代码中应当很有足够的注释,单行注释可以用“//”开始,多行采用“/* */”。如果是修改代码,应该注释中包含对于时间、人名的解释。
28、函数的返回值若非必要尽量不使用void返回值。
三、例子说明
以下举例说明写一个函数的注意事项:
1、变量必须初始化
2、变量定义都放在其作用域最前处
3、调用每个API函数都要做出错处理
4、函数保持统一的入口、出口,出口地方处理释放工作
5、至少包含一套log系统。文件记录或者debug记录。
#define _DEBUG_VIEW
BOOL Function()
{
int ilen = 0;
BOOL bRet = FALSE;
char path[MAX_PATH] = { 0 };
ilen = GetCurrentDirectory(MAX_PATH, path);
if(ilen > MAX_PATH)
{
#ifdef _DEBUG_VIEW
OutputDebugString("路径长度不够!");
#endif
goto exit;
}
else if(0 == ilen)
{
#ifdef _DEBUG_VIEW
OutputDebugString("Function GetCurrentDirectory 函数执行错误");
#endif
goto exit;
}
bRet = TRUE;
exit:
return bRet;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论