匈牙利命名法
许多 Windows 程序员都使用“匈牙利标记法”作为变量命名约定。这是为了纪念具有传奇色彩的微软程序员 Charles Simonyi。这种标记法非常简单,其基本原则为:
-
即变量名(标识符)以一个或者多个小写字母开始,这些字母表示变量的数据型态。例如:szCmdLine 中的 sz 代表“以0结尾的字符串(StringZero)”;在 hInstance 和 hPrevInstance 中的 h 前缀表示“句柄(Handle)”;在 iCmdShow 中的 i 前缀表示“整型(Integer)”。
-
前缀以后就是一个首字母大写(或者多个)的单词,这些单词清楚地指出了源代码内那个对象的用途。比如:m_szStudentName表示一个学生名字的类成员变量,数据类型是字符串型
-
当命名结构变量时,可以用结构名(或者结构名的一种缩写)的小写形式作为变量名称的前缀,或者用作整个变量名。例如:msg 变量是 MSG 型态的结构;wndclass 是 WNDCLASSEX 型态的一个结构;ps 是一个 PAINTSTRUCT 结构,rect 是一个 RECT 结构。
匈牙利表示法能够帮助程序写作者及早发现并避免程序中的错误。由于变量名既描述了变量的作用,又描述了其数据型态,就比较容易避免产生数据型态不合的错误。
下表列出了经常用到的变量名前缀:
1)属性前缀:
前缀 | 数据类型 |
---|---|
g_ | 全局变量 |
c_ | 常量 |
m_ | c++类成员变量 |
s_ | 静态存储变量 |
rg_ | 寄存器变量 |
ex_ | 外部变量 |
2)一般变量类型前缀:
前缀 | 数据类型 |
---|---|
c | char 8位字符 ;cGrade |
str,s | string 字符型 ;strName |
sz | 以"\0"结束的字符串 ;szAppName |
ch | 字符 char 或 WCHAR 或 TCHAR 如果_UNICODE定义,则为16位字符 chName |
b,f | BOOL 布尔值 ,f 表示“flag”;bEnable |
by | 字节 BYTE (无符号字符) |
n,i | int 整型(其大小依赖于操作系统);nLength |
si | short int 短整型 ;siSequ |
n | UINT 无符号值(其大小依赖于操作系统);nHeight |
w | WORD(无符号短整型) 16位无符号值 ;wPos |
f | float 浮点型(有时也指文件) ;fRadius |
d | double 双精度型 ;dArea |
l | LONG 长整型 ;lOffset |
ld | long double 长双精度型 ;ldRate |
dw | DWORD 双字(32位无符号长整型) ;dwRange |
p | * 指针 ;pDoc |
lp | FAR* 远指针 ;lpszName |
lpsz | LPSTR 32位常量字符串指针 ;lpszName |
lpsz | LPCSTR 32位常量字符串指针 ;lpszName |
lpsz | LPCTSTR 如果_UNICODE定义,则为32位常量字符串指针 ;lpszName |
h | handle Windows对象句柄 ;hWnd |
lpfn | callback 指向CALLBACK函数的远指针 |
if | 输入文件流 ;ifDataFile |
of | 输出文件流 ;ofStuFile |
fn | 函数 |
h | 句柄 |
x,y | int,表示 x 坐标和 y 坐标 |
cx,cy | int,表示 x 或 y 的长度,c 表示“count”(计数) |
c(通常用cnt) | 计数 |
C | 类或结构 ; CDocument,CPrintInfo |
S | 结构体 ; SAddress |
r | 实型 |
u | 无符号 |
v | 无效 |
3)描述前缀
前缀 | 数据类型 |
---|---|
Max | 最大 |
Min | 最小 |
Init | 初始化 |
T(或Temp) | 临时变量 |
Src | 源对象 |
Dest | 目的对象 |
4)Microsoft MFC变量(宏)命名规范
前缀 | 数据类型 |
---|---|
IDR_ | 不同类型的多个资源共享标识; IDR_MAIINFRAME; 1~0x6FFF |
IDD_ | 对话框资源; IDD_SPELL_CHECK; 1~0x6FFF |
HIDD_ | 对话框资源的Help上下文; HIDD_SPELL_CHECK; 0x20001~0x26FF |
IDB_ | 位图资源; IDB_COMPANY_LOGO; 1~0x6FFF |
IDC_ | 光标资源; IDC_PENCIL; 1~0x6FFF |
IDI_ | 图标资源;IDI_NOTEPAD;1~0x6FFF |
ID_ | 来自菜单项或工具栏的命令; ID_TOOLS_SPELLING; 0x8000~0xDFFF |
HID_ | 命令Help上下文; HID_TOOLS_SPELLING;0x18000~0x1DFFF |
IDP_ | 消息框提示; IDP_INVALID_PARTNO;8~0xDEEF |
HIDP_ | 消息框Help上下文; HIDP_INVALID_PARTNO;0x30008~0x3DEFF |
IDS_ | 串资源; IDS_COPYRIGHT;1~0x7EEF |
IDC_ | 对话框内的控件; IDC_RECALC; 8~0xDEEF |
… | … |
_AFXDLL | 唯一的动态连接库(Dynamic Link Library,DLL)版本 |
_ALPHA | 仅编译DEC Alpha处理器 |
_DEBUG | 包括诊断的调试版本 |
_MBCS | 编译多字节字符集 |
_UNICODE | 在一个应用程序中打开Unicode |
AFXAPI | MFC提供的函数 |
CALLBACK | 通过指针回调的函数 |
5)Microsoft MFC、句柄、控件及结构的命名规范
示例:
(1)文件名的匈牙利命名法:
文件的名称也应该遵循匈牙利命名法,其以“F”+名字(名字首字母大写)的形式出现。比如:
FFun.cpp(工程名)FName.c(文件名)(打开VC++之后的命名)
(2)常量的匈牙利命名法:
所有的常量命名都是以“c_”+名字(名字都是大写字母,多个单词用“_”连接)的形式出现。比如:
# define c_MAX_NUM 100;
(3)变量的匈牙利命名法:
应用匈牙利命名法,所有的变量名都应该以前缀+名字(名字首字母大写)的形式出现。比如:
char szName;int iNum;
PS:计数(备注)变量不适用匈牙利命名法,直接使用i,j,k。
(4)函数的匈牙利命名法:
函数的命名不带前缀,函数中每一个单词的开头字母都要大写。比如:
int ConvertNumber(int ix);void ShowMessage(char szMessage);
(5)结构体的匈牙利命名法:
结构体类型命名必须以“”+名字(名字都是大写字母,多个单词用“”连接)的形式出现。替代名以名字都是大写字母,多个单词用“”连接的形式出现。结构体变量命名必须以“m”+名字(与变量命名一致)的形式出现。比如:
typedef struct _DATABAS
{
char m_ szProductName[20];
char m_szAuthor[20];
char m_szReleaseDate[16];
char m_szVersion[10];
}DBS_DATABASE;