一、命名规则
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、代码行最大长度宜控制在7080个字符以内。代码不要过长否则眼睛看不过来。长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可选。
8ifforwhiledo 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}
9、程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
10、应当将修饰符 * 和& 紧靠变量名。
11、尽可能在定义变量的同时初始化该变量。
12、指针声明的时候赋值为NULL,释放内存后要将指针赋值为NULL。在使用指针的时候尽量判断指针是否为空。
14、一个函数保证只有一个入口和出口。同时,要有log系统,分析bug之用。在函数中尽量不使用return语句,将return作为函数的唯一出口进行使用。
15、函数注释,在函数开始处,添加函数注释,格式如下:
/*++
作者:
时间:
描述:
参数:
返回值:
--*/
16、函数声明规范:参数要指明输入输出类型,用IN,OUT宏表示。
17swithc语句中最后都要加上default,break这样的处理。
18、宏、enum变量应全部用大写表示。
19、驱动中申请内存要判断是否申请成功。对于有返回值的API调用都有判断返回值是否有效。以做出相应的错误处理。
20、对于布尔类型的变量进行判断是否为真,可以直接进行。其他整型的判断写成如下格式:值 == 变量,以数值为主。防止写错成赋值。
21、关键字之后要留空格。象constvirtualinlinecase 等关键字之后至少要留一个空格,
否则无法辨析关键字。象ifforwhile 等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
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小时内删除。