匈牙利命名法
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的
在编程时,变量、函数的命名是一个极其重要的问题。好的命名方法使变量易于记忆且程序可读性大大提高。Microsoft采用匈牙利命名法来命名Windows API函数和变量。匈牙利命名法是由Microsoft的著名开发人员、Excel的主要设计者查尔斯·西蒙尼在他的博士论文中提出来的,由于西蒙尼的国籍是匈牙利,所以这种命名法叫匈牙利命名法。
匈牙利命名法为C标识符的命名定义了一种非常标准化的方式,这种命名方式是以两条规则为基础:
1.标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。
2.在标识符内,前缀以后就是一个或者多个第一个字母大写的单词,这些单词清楚地指出了源代码内那个对象的用途。比如,m_szStudentName表示一个学生名字的类成员变量,数据类型是字符串型。
附录:
MFC、句柄、控件及结构的命名规范
Windows类型 | 样本变量 | MFC类 | 样本变量 |
HWND | hWnd; | CWnd* | pWnd; |
HDLG | hDlg; | CDialog* | pDlg; |
HDC | hDC; | CDC* | pDC; |
HGDIOBJ | hGdiObj; | CGdiObject* | pGdiObj; |
HPEN | hPen; | CPen* | pPen; |
HBRUSH | hBrush; | CBrush* | pBrush; |
HFONT | hFont; | CFont* | pFont; |
HBITMAP | hBitmap; | CBitmap* | pBitmap; |
HPALETTE | hPaltte; | CPalette* | pPalette; |
HRGN | hRgn; | CRgn* | pRgn; |
HMENU | hMenu; | CMenu* | pMenu; |
HWND | hCtl; | CState* | pState; |
HWND | hCtl; | CButton* | pButton; |
HWND | hCtl; | CEdit* | pEdit; |
HWND | hCtl; | CListBox* | pListBox; |
HWND | hCtl; | CComboBox* | pComboBox; |
HWND | hCtl; | CScrollBar* | pScrollBar; |
HSZ | hszStr; | CString | pStr; |
POINT | pt; | CPoint | pt; |
SIZE | size; | CSize | size; |
RECT | rect; | CRect | rect; |
一般前缀命名规范
前缀 | 类型 | 实例 |
C | 类或结构 | CDocument,CPrintInfo |
S | 结构体 | SAddress |
m_ | 成员变量 | m_pDoc,m_nCustomers |
变量命名规范
前缀 | 类型 | 描述 | 实例 |
c | char | 8位字符 | cGrade |
str | string | 字符型 | strName |
ch | TCHAR | 如果_UNICODE定义,则为16位字符 | chName |
b | BOOL | 布尔值 | bEnable |
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 |
sz |
| 以"\0"结束的字符串 | szAppName |
属性部分
全局变量 g_
常量 c_
c++类成员变量 m_
静态变量 s_
类型部分
指针 p
函数 fn
无效 v
句柄 h
长整型 l
布尔 b
浮点型(有时也指文件) f
双字 dw
字符串 sz
短整型 n
双精度浮点 d
计数 c(通常用cnt)
字符 ch(通常用c)
整型 i(通常用n)
字节 by
字 w
实型 r
无符号 u
描述部分
最大 Max
最小 Min
初始化 Init
临时变量 T(或Temp)
源对象 Src
目的对象 Dest
(1)文件名的匈牙利命名法:
文件的名称也应该遵循匈牙利命名法,其以“F”+名字(名字首字母大写)的形式出现。
比如:
FFun.cpp(工程名)
FName.c(文件名)(打开VC++之后的命名)
(2)常量的匈牙利命名法:
所有的常量命名都是以“c_”+名字(名字都是大写字母,多个单词用“_”连接)的形式出现。
比如:
# define c_MAX_NUM 100;
(3)变量的匈牙利命名法:
应用匈牙利命名法,所有的变量名都应该以前缀+名字(名字首字母大写)的形式出现。
比如:
char szName;
int iNum;
备注:计数(备注)变量不适用匈牙利命名法,直接使用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;