匈牙利命名简介
匈牙利命名起初是由匈牙利的一名程序员Charles Simonyi使用的,因为其在微软工作几年,于是通过微软的产品和文档资料向外界传播开来。这种命名的出发点是把变量名按:
属性+类型+对象描述的格式组合起来的。以使程序员作变量时对变量的类型和其它属性有直观的了解。
匈牙利命名的规则
①、变量的命名规则要求用“匈牙利法则”。即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写, 尽量避免用中文的拼音,要求单词的第一个字母应大写。
即:变量名=变量类型+变量的英文意思(或缩写)
对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
见下表:
基本类型 | 开头标示 | 实例 |
BOOL(bool) | b | bInstall |
BYTE(byte) | by | byData |
short(int) | n | nCount |
LONG(long) | l | lSum |
CHAR(char) | c | cLetter |
FLOAT(float) | f | fDistance |
DOUBLE(double) | d | dData |
VOID(void) | v | vVariant |
unsignedint(WORD) | w | wCount |
unsignedlong(DWORD) | dw | dwProcID |
HANDLE(HINSTANCE) | h | hHandle |
LPCSTR/LPCTSTR/string/Cstring | str | strName |
字符串(以0结尾的) | sz | szFileName |
②、指针变量命名的基本原则为:
对一重指针变量的基本原则为:
“p”+变量类型前缀+命名
如:
int*pPoint;
int**ppPoint;
. . .
多重指针以此类推。
③、全局变量用 g_开头,即:变量名=g_+ 变量
类型+变量的英文意思(或缩写)
如:intg_nCount=0;
④、静态变量用s_开头, 即:变量名=s_+
变量类型+变量的英文意思(或缩写)
如:static ints_nCount;
⑤、成员变量用 m_开头,即:变量名=m_+变量类
型+变量的英文意思(或缩写)
如:intm_nLineCount;
⑥ 、对const的变量要求在变量的命名规则前加入c_,即:c_+变量命名规则
如:constchar*c_szFileName;
⑦、对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。并且要求用大
写。
如:enumcmEMDAYS
{
EM DAYS_M O N DAY;
EMDAYS_TUESDAY;
……
};
⑧、对struct、union、class 变量的命名要求定义的类型用大写。并要加上前缀,其内
部变量的命名规则与变量命名规则一致。
结构一般用 S开头
如:structScmNPoin
{
intnX;// 点的X 位置
intnY;//点的Y 位置
};
联合体一般用 U开头
如:unionUcmLPoint
{
longlX;
longlY;
}
类一般用 C开头
如:
classCcmFPoint
{
public:
floatfPoint;
};
对一般的结构应该定义为类模板,为以后的扩展性考虑
如:
template
classCcmTVector3d
{
public:
TYPEx,y,z;
};
⑨、对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文表达其意思。
如:#defineCM_FILE_NOT_FOUNDCMMAKEHR(0X20B)其中 CM表示类别。
2 、函数的命名规范:
函数的命名应该尽量用英文表达出函数完成的功能。遵循动宾结构的命名法则,函数名中动词在前, 并在命名前加入函数的前缀,函数名的长度不得少于8 个字母。
例如:
longcmGetDeviceCount(……);
3 、函数参数规范:
①、参数名称的命名参照变量命名规范。
②、为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。
③、为了便于其他程序员识别某个指针参数是入口参数还是出口参数,同时便于编译器检查错误,应该在入口参数前加入const 标志。如:
……cmCopyString(constchar*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 等循环变量可以不注释。
例如: longlLineCount// 线的根数。
3 、文件的注释:
文件应该在文件开头加入以下注释:
/////////////////////////////////////////////////////////////////////
//工程:文件所在的项目名。
//作者:**,修改者:**
//描述:说明文件的功能。
//主要函数:…………
//版本:说明文件的版本,完成日期。
//修改:说明对文件的修改内容、修改原因以及修改日期。
//参考文献:......
/////////////////////////////////////////////////////////////////////
为了头文件被重复包含要求对头文件进行定义如下:
#ifndef__FILENAME_H__
#define__FILENAME_H__
其中FILENAME为头文件的名字。
4、其他注释:
在函数内我们不需要注释每一行语句。但必须在各功能模块的每一主要部分之前添加块注释,注释每一组语句,在循环、流程的各分支等,尽可能多加以注释。
其中的循环、条件、选择等位置必须注释。
对于前后顺序不能颠倒的情况,建议在注释中增加序号。
例如:
在其他顺序执行的程序中,每隔 3—5 行语句,必须加一个注释,注明这一段语句所组成的小模块的作用。对于自己的一些比较独特的思想要求在注释中标明。