n年以前,Charles Simonyi(他后来成为微软的著名程序员)设计了一种以前缀为基础的命名方法,这种方法后来称为"匈牙利表示法"以记念他.他的思想是根据每个标识符所代表的含义给它一个前缀.微软后来采用了这个思想,给每个标识符一个前缀以说明它的数据类型.因此,整型变量的前缀是n,长整型变量是nl,字符型数组变量是ca,以及字符串(以空类型结尾的字符数组)以sz为前缀.这些名字可能会非常古怪.比如说:lpszFoo表示"Foo"是一个指向以空字符为结尾的字符串的长整型指针.
这种方法的优点是使人能够通过变量的名字来辨别变量的类型,而不比去查找它的定义.遗憾的是,这种方法不仅使变量名字非常绕口,而且使改变变量类型的工作变得十分艰巨.在Windows3.1中,整型变量为16为宽.如果我们在开始时采用了一个整型变量,但是在通过30---40个函数的计算之后,发现采用整型变量宽度不够,这时我们不仅要改变这个变量的类型,而且要改变这个变量在这30--40个函数中的名字.
因为不切实际,除了一些顽固的Windows程序员外已经没有人再使用"匈牙利表示法"了.毫无疑问,在某种场合它依然存在,但大部分人现在已经抛弃它了.一般而言,输入前缀是一种糟糕的想法,因为它把变量于其类型紧紧地绑在了一起.
对于30行以下的函数,匈牙利方法一般有优势。尤其是对界面编程,有优势。但对于有强烈的算法要求、尤其是有很多抽象类型的C++程序,匈牙利方法简直是一个灾难。看你用在什么地方。现在有了很好的IDE工具,如:VC,SourceInsight等.选中变量,会自动提示告诉你它的声明和定义,这样匈牙利命名法就没有很大的必要了.无非就是为了程序可读性较好.实际上良好的代码书写习惯比强制使用匈牙利命名法更重要.系统性。整体性。可读性。分类要清楚。要有注释!
匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。它是由微软内部的一个匈牙利人发起使用的,结果它在微软内部逐渐流行起来,并且推广给了全世界的Windows开发人员。下面将介绍匈牙利命名法,后面的例子里也会尽量遵守它和上面的代码风格。还是那句话,并不是要求所有的读者都要去遵守,但是希望读者作为一个现代的软件开发人员都去遵守它。
匈牙利命名法
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 |
| m_ | 成员变量 | m_pDoc,m_nCustomers |
?
?
?
变量命名规范 | 前缀 | 类型 | 描述 | 实例 |
| ch | char | 8位字符 | chGrade |
| ch | TCHAR | 如果_UNICODE定义,则为16位字符 | chName |
| b | BOOL | 布尔值 | bEnable |
| n | int | 整型(其大小依赖于操作系统) | nLength |
| n | UINT | 无符号值(其大小依赖于操作系统) | nHeight |
| w | WORD | 16位无符号值 | wPos |
| l | LONG | 32位有符号整型 | lOffset |
| 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函数的远指针 | ? |
应用程序符号命名规范 | 前缀 | 符号类型 | 实例 | 范围 |
| 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 |
?
Microsoft MFC宏命名规范 | 名称 | 类型 |
| _AFXDLL | 唯一的动态连接库(Dynamic Link Library,DLL)版本 |
| _ALPHA | 仅编译DEC Alpha处理器 |
| _DEBUG | 包括诊断的调试版本 |
| _MBCS | 编译多字节字符集 |
| _UNICODE | 在一个应用程序中打开Unicode |
| AFXAPI | MFC提供的函数 |
| CALLBACK | 通过指针回调的函数 |
库标识符命名法 | 标识符 | 值和含义 |
| u | ANSI(N)或Unicode(U) |
| d | 调试或发行:D = 调试;忽略标识符为发行。 |
静态库版本命名规范 | 库 | 描述 |
| NAFXCWD.LIB | 调试版本:MFC静态连接库 |
| NAFXCW.LIB | 发行版本:MFC静态连接库 |
| UAFXCWD.LIB | 调试版本:具有Unicode支持的MFC静态连接库 |
| UAFXCW.LIB | 发行版本:具有Unicode支持的MFC静态连接库 |
动态连接库命名规范 | 名称 | 类型 |
| _AFXDLL | 唯一的动态连接库(DLL)版本 |
| WINAPI | Windows所提供的函数 |
Windows.h中新的命名规范
| 类型 | 定义描述 |
| WINAPI | 使用在API声明中的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的API中使用该类型 |
| CALLBACK | 使用在应用程序回叫例程,如窗口和对话框过程中的FAR PASCAL的位置 |
| LPCSTR | 与LPSTR相同,只是LPCSTR用于只读串指针,其定义类似(const char FAR*) |
| UINT | 可移植的无符号整型类型,其大小由主机环境决定(对于Windows NT和Windows 9x为32位);它是unsigned int的同义词 |
| LRESULT | 窗口程序返回值的类型 |
| LPARAM | 声明lParam所使用的类型,lParam是窗口程序的第四个参数 |
| WPARAM | 声明wParam所使用的类型,wParam是窗口程序的第三个参数 |
| LPVOID | 一般指针类型,与(void *)相同,可以用来代替LPSTR |
?
表一:匈牙利命名法
| 前缀 | 类型 | 描述 | 实例 |
| arr | Array | 静态数组 | arrPoint |
| b | BOOL | 布尔值 | bEnabled |
| by | unsigned char(BYTE) | 8位无符号字符 | byWeek |
| ch | Char | 8位字符 | chGrade |
| tch | TCHAR | 如果是_UNICODE,为16位字符 | tchName |
| i/n | Int | 整形(其大小依赖于操作系统) | iRange |
| u | UINT | 无符号整形(其大小依赖于操作系统) | nLength |
| us | unsigned short | 无符号短整形 | usPort |
| w | WORD | 16位无符号值 | wParam |
| l | LONG | 32位有符号整形 | loffset |
| dw | DWORD | 32位无符号整形 | dwVolume |
| f | Float | 4字节浮点数 | fHigh |
| d | Double | 8字节浮点数 | dAmount |
| cy | CURRENCY | 8字节货币类型 | cySell |
| p | * | 指针 | pDoc |
| lp | FAR * | 远指针 | lpDoc |
| lpsz | LPSTR | 为32位字符串指针 | lpszName |
| lpcsz | LPCSTR | 32位常量字符串指针 | lpcszName |
| lpctsz | LPCTSTR | 如果_UNICODE定义,为32位常量字符串指针 | lpctszName |
| bstr | BSTR | 带有4字节长度前缀的w_chart数组 | bstrMessage |
| pbstr | BSTR* | BSTR数据类型指针 | pbstrMsg |
| str | String | CString类型的字符串 | strMessage |
| och | OLECHAR | OLECHAR字符类型 | ochX |
| osz | OLECHAR* | OLECHAR字符串类型 | oszX |
| var | VARIANT | VARIANT数据类型 | var |
| pvar | VARIANT* | VARIANT数据类型指针 | pvar |
| sa | SAFEARRAY | SAFEARRAY数据类型 | sa |
| psa | SAFEARRAY* | SAFEARRAY数据类型指针 | psa |
| dlg | CDialog | Windows对话框 | dlg |
| stc | CStatic | Windows静态文本控件 | stc |
| edt | Cedit | Windows编辑框控件 | edt |
| lsb | CListBox | Windows列表控件 | lsb |
| btn | CButton | Windows按钮控件 | btn |
| scb | CScrollBar | Windows滚动条控件 | scb |
| spn | CSpinButtonCtrl | Windowswe微调按钮控件 | spn |
| tab | CTabCtrl | Windows选项卡控件 | tab |
| rtf | CRichEditCtrl | Windows富文本编辑框控件 | rtf |
| sld | CSliderCtrl | Window滑块控件 | sld |
| list | ClistCtrl | Windows列表控件 | list |
| tre | CtreeCtrl | Windows树形控件 | tre |
| dtc | CDateTimeCtrl | Windows时间选取器控件 | dtc |
| prg | CProgressCtrl | Windows进度指示器控件 | prg |
| cbo | CComboBox | Windows组合框控件 | cbo |
| ils | CImageList | Windows图像列表 | ils |
| tlb | CToolBarCtrl | Windows工具条控件 | tlb |
| mnu | Cmenu | Windows菜单控件 | mnu |
| sta | CStatusBar | Windows状态条控件 | sta |
| wnd | CWnd | Windows窗口 | wnd |
| cx | X | Windows X坐标 | cx |
| cy | Y | Windows Y坐标 | cy |
| pt | Cpoint | Windows点阵 | hWnd |
| size | Csize | Windows尺寸 | size |
| rect/rc | Crect | Windows矩形 | rect |
| pen | Cpen | Windows画笔 | pen |
| br | Cbrush | Windows刷子 | br |
| fnt | Cfont | Windows字体 | fnt |
| cr | COLORREF | Windows颜色值RGB | cr |
| PMp | Temp | 临时变量 | PMpBuff |
| h | Handle | Windows对象句柄 | hWnd |
| lpfn | Callback | 指向CALLBACK函数的远指针 | lpfnAbort |
| it/iter | iterator | 迭代子 | it |
| vect | std::vector | 标准模板库 | vect |
| map | std:map | 标准模板库 | map |
| deque | std:deque | 标准模板库 | deque |
| list | std:list | 标准模板库 | list |
| set | std:set | 标准模板库 | Set |
| multiset | std:multiset | 标准模板库 | multiset |
| multimap | std:multimap | 标准模板库 | multimap |
指针类型的变量,必须加上前缀"p",如:int* pnValue;。
全局(静态)变量的命名规则同第一条的规定,并且必须加上前缀"g_"。
类成员(静态)变量的命名规则同第一条的规定,并且必须加上前缀"m_"。
模块(函数/过程)内部的重要变量命名遵循第一条的规定。
模块(函数/过程)内部的静态变量命名遵循第一条的规定,并且加上前缀"s_"。
其余变量在不损害程序易读易懂原则的基础上酌情处理。这些变量通常是模块内的临时变量,如循环控制变量、数组的下标等,它们可用缩写进行简化处理,如:int i;。3.1.1.1 常量命名规则
宏(#define)或者常量修饰符(const):大写字母组成的名词词组,单词间用下划线作为连接符,如:#define INVALID_CLOSE 0; const double INVALID_CLOSE = double(0);。
枚举类型(enum):此时的命名规则同"变量命名的一般性规则",可参考MFC或ADO等的命名方式。3.1.1.2 函数命名规则单词构成的动宾词组,每个单词首字母大写,其余字母小写。如:void DrawLine ( void );。3.1.1.3 类命名规则
类的原型,是前缀"C"加单词构成的动宾词组,每个单词首字母大写,其余字母小写。如:class CStockPacket; class CPacket;。
类的实例变量,采用小写首字母缩写的方式定义,如:CStockPacket sp;。
在对类的成员变量和成员函数定义时,要加以分类,并界定相应的存取权限(参见表二:类成员的分类描述)表二:类成员的分类描述 分类描述 | 存取权限(依实际应用而定) |
| // Constructors | Public |
| // Attributes | Private |
| // Operations(对于com组件是//Methods) | Public |
| // Overridables | Protected |
| // Implementation | Private |
3.1.1.4 结构命名规则
结构的原型采用组合词的方式定义,并且全部采用大写字符的形式。如:typedef struct tagStockTrans{ DWORD dwOpen; ...} STOCKTRANS;
结构的实例变量,采用小写首字母缩写的方式定义,如:STOCKTRANS st;。出处:网络
转载时必须以链接形式注明出处及本声明!
阅读(3061) |
评论(19) |
引用(0)
引用地址:
注意: 该地址仅在今日23:59:59之前有效