匈牙利基本命名法
匈牙利命名法是一名匈牙利程序员发明的,他在Microsoft工作了多年,此命名法就是通过Microsoft的各种产品和文档被传出来的。多数有经验的程序员,不管他们用的是哪种程序设计语言,都或多或少在使用它。
匈牙利命名法的基本原则是:
变量名=属性+类型+对象描述
即一个变量名由3部分信息组成,这样命名的好处是程序员很容易理解变量的类型、用途,而且便于记忆。
下面给出一些推荐使用的规则例子,可以选择使用,也可以根据个人喜好作些修改后再使用。
1.属性部分
全局变量: g_
常量 : c_
类成员变量: m_
2.类型部分
by:无符号字符/字节(BYTE)
b:布尔型(bool)
w:16位无符号值(WORD)
dw:32位无符号整型(DWORD)
i:整型(int) (其大小依赖于操作系统)
l:32位有符号整型(long)
f:浮点型(float)
d:双精度浮点型(double)
str:字符串对象(cstring)
c:字符型(char)
sz:以零结束的字符串(char[])
p:指针(pointer)
lp:长指针(long pointer)
lpsz:32位字符串指针(char *)指针:
h:句柄(handle)
n:整数(表示一个数number)
x, y:整数(通常用于x坐标和y坐标)
v:空类型(void)
fp:函数指针
msg:消息(message)
a:数据组(array)
示例:
int iaWidth[7];
o:对象(object)
s:结构(struct)
u:联合(unio)
t:类型(type)
3.描述部分
初始化: Init
临时变量: Tmp
目的对象: Dst
源对象: Src
窗口: Wnd
举例说明:
hwnd: h表示句柄,wnd表示窗口,合起来为“窗口句柄”。
m_bFlag: m表示成员变量,b表示布尔,合起来为:“某个类的成员变量,布尔型,是一个状态标志”。
1,变量命名;
2,常量命名、宏定义; 3,资源名字定义格式;
4,函数命名和命名空间、类的命名、接口的命名; 5,结构体命名; 6,控件的命名; 7,注释;
匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成员变量),再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。
匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。 匈牙利命名法中常用的小写字母的前缀: 前缀类型
a 数组 (Array)
b 布尔值 (Boolean)
by 字节 (Byte)
c 有符号字符 (Char)
cb 无符号字符 (Char Byte,没有多少人用)
cr 颜色参考值 (ColorRef)
cx,cy 坐标差(长度 ShortInt)
dw Double Word
fn 函数
h Handle(句柄)
i 整型
l 长整型 (Long Int)
lp Long Pointer
m_ 类的成员
匈牙利命名法的好处:
从名字中就可以看出变量的类型
拥有类似语义的多个变量可以在一个代码块中使用:dwWidth, iWidth, fWidth, dWidth
变量名在仅仅知道他们的类型时可以被轻易记住
可以使变量名更加一致
决定一个变量名的时候可以更机械化,更快
不合适的类型转换和操作可以在阅读代码的时候被检测出来
在那些数字被当作字符串处理的基于字符串的语言中非常有用(例如Tcl)
在匈牙利应用命名法中,变量名确保不会犯以下错误:
heightWindow = window.getWidth();
遵守代码风格和匈牙利命名法的代码:
#include "sy.h"
extern int *rgwDic;
extern int bsyMac;
struct SY *PsySz(char sz[]) {
char *pch;
int cch;
struct SY *psy, *PsyCreate();
int *pbsy;
int cwSz;
unsigned wHash=0;
pch=sz;
while (*pch!=0)
wHash=wHash<>11+*pch++;
cch=pch-sz;
pbsy=&rgbsyHash[(wHash&077777)%cwHash]
for (; *pbsy!=0; pbsy = &psy->bsyNext) {
char *szSy;
szSy= (psy=(struct SY*)&rgwDic[*pbsy])->sz;
pch=sz;
while (*pch==*szSy++) {
if (*pch++==0)
return (psy);
}
}
cwSz=0;
if (cch>=2)
cwSz=cch-2/sizeof(int)+1;
*pbsy=(int *)(psy=PsyCreate(cwSY+cwSz))-rgwDic;
Zero((int *)psy,cwSY);
bltbyte(sz, psy->sz, cch+1);
return(psy);
}
详细匈牙利命名规则可以参考http://www.cnblogs.com/totem1990/archive/2012/03/26/2418474.html。