1、变量名的命名规则 ①、变量的命名规则要求用“匈牙利法则” 即开头字母用变量的类型,其余部分用变 量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写 即: 变量名=变量类型+变量的英文意思(或缩写) 对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处 见下表: bool(BOOL) 用 b 开头 bIsParent byte(BYTE) 用 by 开头 byFlag short(int) 用 n 开头 nStepCount long(LONG) 用 l 开头 lSum char(CHAR) 用 c 开头 cCount float(FLOAT) 用 f 开头 fAvg double(DOUBLE) 用 d 开头 dDeta void(VOID) 用 v 开头 vVariant unsigned int(WORD) 用 w 开头 wCount unsigned long(DWORD) 用 dw 开头 dwBroad HANDLE(HINSTANCE) 用 h 开头 hHandle DWORD 用 dw 开头 dwWord LPCSTR(LPCTSTR) 用 str 开头 strString 用 0 结尾的字符串 用 sz 开头 szFileName 对未给出的变量类型要求提出并给出命名建议给技术委员会。
②、指针变量命名的基本原则为: 对一重指针变量的基本原则为: “p”+变量类型前缀+命名 如一个 float*型应该表示为 pfStat 对多重指针变量的基本规则为: 二重指针: “pp”+变量类型前缀+命名 三重指针: “ppp”+变量类型前缀+命名 ...... ③、全局变量用 g_开头,如一个全局的长型变量定义为 g_lFailCount,即:变量名=g_+变 量类型+变量的英文意思(或缩写) ④、静态变量用 s_开头,如一个静态的指针变量定义为 s_plPerv_Inst,即: 变量名 =s_+变量类型+变量的英文意思(或缩写) ⑤、成员变量用 m_开头,如一个长型成员变量定义为 m_lCount;即:变量名=m_+变量 类型+变量的英文意思(或缩写) ⑥、对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀并且要求用大 写 如:enum cmEMDAYS { EMDAYS_MONDAY; EMDAYS_TUESDAY; …… }; ⑦、对 struct、union、class 变量的命名要求定义的类型用大写。
并要加上前缀,其内 部变量的命名规则与变量命名规则一致 结构一般用 S 开头 如:struct ScmNPoint { int nX;//点的 X 位置 int nY; //点的 Y 位置 }; 联合体一般用 U 开头 如: union UcmLPoint { long lX; long lY; } 类一般用 C 开头 如: class CcmFPoint { public: float fPoint; }; 对一般的结构应该定义为类模板,为以后的扩展性考虑 如: template class CcmTVector3d { public: TYPE x,y,z; }; ⑧、对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文表达其意思如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中 CM 表示类别。
⑨、对 const 的变量要求在变量的命名规则前加入 c_,即:c_+变量命名规则;例 如: const char* c_szFileName; 2、 函数的命名规范: 函数的命名应该尽量用英文表达出函数完成的功能遵循动宾结构的命名法则,函数 名中动词在前,并在命名前加入函数的前缀,函数名的长度不得少于 8 个字母 例如: long cmGetDeviceCount(……); 3、函数参数规范: ①、 参数名称的命名参照变量命名规范 ②、 为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律 采用指针或引用方式传递 ③、 为了便于其他程序员识别某个指针参数是入口参数还是出口参数,同时便于 编译器检查错误,应该在入口参数前加入 const 标志如: ……cmCopyString(const char * c_szSource, char * szDest) 4、引出函数规范: 对于从动态库引出作为二次开发函数公开的函数,为了能与其他函数以及 Windows 的 函数区分,采用类别前缀+基本命名规则的方法命名。
例如:在对动态库中引出的一个图 象编辑的函数定义为 imgFunctionname(其中 img 为 image 缩写) 现给出三种库的命名前缀: ①、 对通用函数库,采用 cm 为前缀 ②、 对三维函数库,采用 vr 为前缀 ③、 对图象函数库,采用 img 为前缀 对宏定义,结果代码用同样的前缀 5、文件名(包括动态库、组件、控件、工程文件等)的命名规范: 文件名的命名要求表达出文件的内容,要求文件名的长度不得少于 5 个字母,严禁使 用象 file1,myfile 之类的文件名 三、注释规范: 1、函数头的注释 对于函数,应该从“功能” , “参数” , “返回值” 、 “主要思路” 、 “调用方法” 、 “日期” 六个方面用如下格式注释: //程序说明开始 //================================================================// // 功能: 从一个 String 中删除另一个 String。
// 参数: strByDelete,strToDelete // (入口) strByDelete: 被删除的字符串(原来的字符串) // (出口) strToDelete: 要从上个字符串中删除的字符串 // 返回: 找到并删除返回 1,否则返回 0 (对返回值有错误编码的要// 求列出错误编码) // 主要思路:本算法主要采用循环比较的方法来从 strByDelete 中找到 // 与 strToDelete 相匹配的字符串,对多匹配 strByDelete // 中有多个 strToDelete 子串)的情况没有处理请参阅: // 书名...... // 调用方法:...... // 日期:起始日期,如:2000/8/21.9:40--2000/8/23.21:45 //================================================================// 函数名(……) //程序说明结束 ①、 对于某些函数,其部分参数为传入值,而部分参数为传出值,所以对参数要 详细说明该参数是入口参数,还是出口参数,对于某些意义不明确的参数还要做详细说明 (例如:以角度作为参数时,要说明该角度参数是以弧度(PI),还是以度为单位),对既是 入口又是出口的变量应该在入口和出口处同时标明。
等等 ②、 函数的注释应该放置在函数的头文件中,在实现文件中的该函数的实现部分应该同时放置该注释 ③、 在注释中应该详细说明函数的主要实现思路、特别要注明自己的一些想法, 如果有必要则应该写明对想法产生的来由对一些模仿的函数应该注释上函数的出处 ④、 在注释中详细注明函数的适当调用方法,对于返回值的处理方法等在注释 中要强调调用时的危险方面,可能出错的地方 ⑤、 对日期的注释要求记录从开始写函数到结束函数的测试之间的日期 ⑥、 对函数注释开始到函数命名之间应该有一组用来标识的特殊字符串 如果算法比较复杂,或算法中的变量定义与位置有关,则要求对变量的定义进行图解 对难以理解的算法能图解尽量图解 2、变量的注释: 对于变量的注释紧跟在变量的后面说明变量的作用原则上对于每个变量应该注释, 但对于意义非常明显的变量,如:i,j 等循环变量可以不注释 例如: long lLineCount //线的根数 3、文件的注释: 文件应该在文件开头加入以下注释: ///////////////////////////////////////////////////////////////////// // 工程: 文件所在的项目名。
// 作者:**,修改者:** // 描述:说明文件的功能 // 主要函数:………… // 版本: 说明文件的版本,完成日期 // 修改: 说明对文件的修改内容、修改原因以及修改日期 // 参考文献: ...... ///////////////////////////////////////////////////////////////////// 为了头文件被重复包含要求对头文件进行定义如下: #ifndef __FILENAME_H__ #define __FILENAME_H__ 其中 FILENAME 为头文件的名字 4、其他注释: 在函数内我们不需要注释每一行语句但必须在各功能模块的每一主要部分之前添加 块注释,注释每一组语句,在循环、流程的各分支等,尽可能多加以注释 其中的循环、条件、选择等位置必须注释 对于前后顺序不能颠倒的情况,建议在注释中增加序号 例如: 在其他顺序执行的程序中,每隔 3—5 行语句,必须加一个注释,注明这一段语句所组 成的小模块的作用。
对于自己的一些比较独特的思想要求在注释中标明 四、程序健壮性: 1、函数的返回值规范: 对于函数的返回位置,尽量保持单一性,即一个函数尽量做到只有一个返回位置单 入口。