匈牙利命名法、骆驼命名法、帕斯卡命名法介绍
变量(还包括宏)的命名规则,比较系统和彻底的有 Windows 编程中用到的匈牙利命名法。匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成员变量),再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示 指向一个以0字符结尾的字符串的长指针成员变量。
有关匈牙利命名法的一点有意思的说明是它的名字的由来。这种命名技术是由一位能干的 Microsoft 程序员查尔斯·西蒙尼(Charles Simonyi) 提出的,他出生在匈牙利。在 Microsoft 公司中和他一起工作的人被教会使用这种约定。这对他们来说一切都很正常。但对那些 Simonyi 领导的项目组之外的人来说却感到很奇特,他们认为这是死板的表达方式,甚至说代有这样奇怪的外观是因为它是用匈牙利文写的。从此这种命名方式就被叫做匈牙利命名法。
基本原则是:变量名=属性+类型+对象描述
即一个变量名是由三部分信息组成,这样,程序员很容易理解变量的类型、用途,而且便于记忆。
下边是一些推荐使用的规则例子,你可以挑选使用,也可以根据个人喜好作些修改再用之。
⑴属性部分:
全局变量: g_
常量: c_
类成员变量: m_
⑵类型部分:
指针: p
句柄: h
布尔型: b
浮点型: f
无符号: u
⑶描述部分:
初始化: Init
临时变量: Tmp
目的对象: Dst
源对象: Src
窗口: Wnd
下边举例说明:
hwnd: h表示句柄,wnd表示窗口,合起来为“窗口句柄”。
m_bFlag: m表示成员变量,b表示布尔,合起来为:“某个类的成员变量,布尔型,是一个状态标志”。
匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。
匈牙利命名法中常用的小写字母的前缀
前缀 类型
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_ 类的成员
n 短整型 (Short Int)
np Near Pointer
p Pointer
s 字符串型
sz 以null做结尾的字符串型 (String with Zero End)
w Word
但是在任何情况下,都硬性规定使用匈牙利命名法是迂腐的。尤其是 Unix 编程,在使用没有变量名、关键字自动补齐功能的编辑器,如 vi 下,去敲入大小写混合的变量名是痛苦的。其实只要注意两个原则:1. 含义清晰,不易混淆; 2. 不和其它模块、系统API的命名空间相冲突即可。
有意识的为变量名、宏名加上本模块的关键字,就不至于和其它模块、系统API的命名空间相冲突;
例如: 宏的名称过短,如:"DEBUG" 或 "_DEBUG",很可能和别的模块,系统模块相冲突;
局部变量尤其是循环变量外,使用约定俗成的 i,j,k ,没有问题;
宏、常量、枚举enum,全部用大写字母;
全局变量加上前缀 "g",后面跟上首字母大写的单词;
全局变量吗,费事一点可以谅解。
匈牙利命名法
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 |
二、骆驼命名法: (camel方法)
骆驼式命令法,正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:
printEmployeePaychecks();
print_employee_paychecks();
第一个函数名使用了骆驼式命名法——函数名中的每一个逻辑断点都有一个大写字母来标记;第二个函数名使用了下划线法----函数名中的每一个逻辑断点都有一个下划线来标记。
骆驼式命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得当相多。另一方面,下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。
三、帕斯卡(pascal)命名法:
与骆驼命名法类似。只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写
如:public void DisplayInfo();
string UserName;
二者都是采用了帕斯卡命名法.
在C#中,以帕斯卡命名法和骆驼命名法居多。
简单说
MyData 就是一個帕斯卡命名的示例
而myData是一個骆驼命名法,它第一個單詞的第一個字母小寫,後面的單詞首字母大寫,看起來像一個骆驼 而iMyData是一個匈牙利命名法,它的小寫的i說明了它的型態,後面的和帕斯卡命名相同,指示了該變量的用途.
posted on 2008-11-19 18:52 Peter wang的学习.NET之路 阅读(597) 评论(0) 编辑 收藏 举报