C++匈牙利命名法

匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。它是由微软内部的一个匈牙利人发起使用的,结果它在微软内部逐渐流行起来,并且推广给了全世界的Windows开发人员。先知Petzold在他的巨著《Programming windows》中采用匈牙利记法。由于该书影响力巨大,故他间接也成了匈牙利记法的布道者。下面将介绍匈牙利命名法。

一、变量命名

    变量名前加上表示其类型的前缀(如下表),如果变量名由几个单词组成,那么每个单词首字母大写,禁用下划线_

a Array 数组

b BOOL (int) 布尔(整数)

by Unsigned Char (Byte) 无符号字符(字节)

c Char 字符(字节)

cb Count of bytes 字节数

cr Color reference value 颜色(参考)值

cx Count of x (Short) x的集合(短整数)

dw DWORD (unsigned long) 双字(无符号长整数)

f Flags (usually multiple bit values) 标志(一般是有多位的数值)

fn Function 函数

g_ global 全局的

h Handle 句柄

i Integer 整数

l Long 长整数

lp Long pointer 长指针

m_ Data member of a class 一个类的数据成员

n Short int 短整数

p Pointer 指针

s String 字符串

sz Zero terminated String 以0结尾的字符串

tm Text metric 文本规则

u Unsigned int 无符号整数

ul Unsigned long (ULONG) 无符号长整数

w WORD (unsigned short) 无符号短整数

x,y x, y coordinates (short) 坐标值/短整数

v void 空

二、函数命名

    规则同变量命名,只是不用加前缀。

三、类型和常量命名

    字符全部大写,可以用下划线。

四、类的命名

    以C为前缀,每个单词的首字母大写。

五、VC常用前缀列表:

前缀 类型 描述 例子

ch char 8位字符 chGrade

ch TCHAR 16位UNICODE类型字符 chName

b BOOL 布尔变量 bEnabled

n int 整型(其大小由操作系统决定) nLength

n UINT 无符号整型(其大小由操作系统决定) nLength

w WORD 16位无符号整型 wPos

l LONG 32位有符号整型 lOffset

dw DWORD 32位无符号整型 dwRange

p * Ambient memory model pointer 内存模块指针,指针变量 pDoc

lp FAR* 长指针 lpDoc

lpsz LPSTR 32位字符串指针 lpszName

lpsz LPCSTR 32位常量字符串指针 lpszName

lpsz LPCTSTR 32位UNICODE类型常量指针 lpszName

h handle Windows对象句柄 hWnd

lpfn (*fn)() 回调函数指针 lpfnAbort

MSDN中给出了一段遵守代码风格和匈牙利命名法的代码参考如下:

1 #include “sy.h”

2 extern int *rgwDic;

3 extern int bsyMac;

4 struct SY *PsySz(char sz[])

6 {
7 char *pch;

8 int cch;

9 struct SY *psy, *PsyCreate();

10 int *pbsy;

11 int cwSz;

12 unsigned wHash=0;

13 pch=sz;

14 while (*pch!=0)

15 wHash=wHash<>11+*pch++;

16 cch=pch-sz;

17 pbsy=&rgbsyHash[(wHash&077777)%cwHash];

18 for (; *pbsy!=0; pbsy = &psy->bsyNext)

19 {
20 char *szSy;

21 szSy= (psy=(struct SY)&rgwDic[pbsy])->sz;

22 pch=sz;

23 while (pch==szSy++)

24 {
25 if (*pch++==0)

26 return (psy);

27 }

28 }

29 cwSz=0;

30 if (cch>=2)

31 cwSz=cch-2/sizeof(int)+1;

32 *pbsy=(int *)(psy=PsyCreate(cwSY+cwSz))-rgwDic;

33 Zero((int *)psy,cwSY);

34 bltbyte(sz, psy->sz, cch+1);

35 return(psy);

36 }

留下评论