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 |
1.1 构造匈牙利名称
一个通常的匈牙利名称由一个或者多个前缀 (prefix )、一个基本标识 (base tag )和一个修饰符 (qualifier )拼接而成。基本标识指示了变量的类型(如" co " 代表color ),前缀修正该类型(如" rg " 表示数组,那么" rgco " 就表示颜色数组),修饰符描述了该特定类型的应用(如" rgcoGray " 表示用作灰度的颜色数组)。并非所有名字都会使用全部组成元素,前缀往往是不需要的,而当类型的应用是显而易见的时候,比如当代码中只包含一个相关类型时,修饰符也可以省略。
值得提醒的是:许多(也许绝大部分)基本标识和修饰符将是应用程序相关的,因为它们被用于表示应用程序定义的类型和应用。虽然我们已经为一些基本类型定义了标准标识(下面将列出其中一部分),但是在更适于使用抽象类型的场合下使用这些标准标识是错误的。例如,如果一个color 恰好是用long 来实现的,那么有人可能会用" rgl " 来标识一个颜色数组,但是这样将破坏对color 的抽象。
当匈牙利命名法用于函数名称时,修饰符通常仅仅标识了函数的动作。有时在基本标识符后添加描述函数参数的匈牙利类型会很有用。当然,函数名的首字母一定要大写。例如" FInitFooFromHwndXY " 应当是一个函数的名字,该函数将使用类型为Hwnd ,X 和Y 的参数来初始化一个" foo " 结构,并且返回一个Boolean 成功代码。这种做法并非强制性的,只有当这样做会让函数名更易于理解才这样做。
1.2 标准基本标识
下面的表中给出了基本类型的标准基本标识。如上所述,应用程序将为其内部类型定义许多自己的标识。
f | 标志( BOOL ) 。取值为TRUE 或者FALSE 。修饰符应当描述何时该标志为TRUE ,例如fError 表示当错误发生时变量为TRUE 。 |
ch | 单字节字符( CHAR ) 。 |
sz | 以0 结尾的CHAR 型字符串(经典的C 字符串)。有时可以描述字符串的最大长度,如" sz255 " 表示实际的字符串体可以容纳255 个字符,因此必需分配256 个字符。 |
st | 带长度前缀的CHAR 型字符串。这种字符串长度不超过255 个字符,因为其长度必须存放在一个字节中。如同sz 一样,可以用" st32 " 来表示字符串最大长度为32 ,因此需要分配33 个字符空间来存放字符及其长度。 |
stz | 带长度前缀同时也以0 结尾的CHAR 型字符串。注意如果在名称中描述了长度length ,那么至少要分配length+2 个CHAR 。 |
chw, wt, wz, wtz | ch ,sz ,st 和stz 的宽字符( WCHAR ) 版本。所有最终用户可见的字符串都必须使用宽字符串(UNICODE) 。 |
fn | 函数。通常和" p " 前缀(见下)连用成为" pfn " ,因为在C 中只能将函数地址存放在变量中。 |
b | 一个 BYTE 。 |
w | 一个16 位的无符号数量值( WORD , SHORT , or USHORT ) 。 |
dw | 一个32 位的无符号双字( DWORD ) 。 |
l | 一个 LONG ( 有符号32 位数量值). |
u | 一个无符号长整型数( ULONG ) 。在经典的匈牙利命名法中,这代表一个无符号word ,在Office 中,这代表一个无符号32 位数量值,与" dw " 相同,但是当类型是数值时更倾向用" u " 标识(和ULONG 类型)。 |
v | Void 类型。总是和" p " 连用构成" pv " ,标识指向未知类型的指针。 |
sc | OLE SCODE |
hr | OLE HRESULT |
var | OLE VARIANT |
varg | OLE VARIANTARG |
1.3 标准前缀
下面表中给出了用于修饰基本标识类型的标准前缀。可以使用一个或者多个前缀。应用程序有可能(但是可能很罕见)需要定义自己的前缀(典型情况是一个应用程序将只定义基本标识和修饰符)。
p | 指针。例如" pch " 标识指向一个字符的指针,在经典的微软匈牙利命名法中," p " 代表near pointer ,相应地," lp " 和" hp " 用于表示long (far) pointer 和huge pointer 。在32 位世界里,这不再是个问题了。 |
rg | 数组( 从"range" 变来) 。例如" rgch " 表示字符数组。同C/C++ 用法一样,这可以是一个分配好的数组的名字,也可以是指向数组的指针的名字。 |
i | 基本类型数组的索引。例如" ich " 表示字符数组的索引。 |
c | 基本类型项目的总数。例如" cch " 表示字符总数。 |
n | 另一种表示某基本类型项目的总数的前缀(表示"number of" ),但是最好用" c " 。 |
d | 某基本类型值的差值,例如" dx " 表示两个类型为x 的值的差。 |
h | 句柄。一个到不能被用户间接访问的某基本类型项目的非透明引用(过去使用此定义是因为对可移动内存块有不同用法)。例如" hwnd " 是到窗口(" wnd ") 的句柄,因为句柄不在你的地址空间中,所以不允许你间接访问窗口结构中的域(这样还保持了非透明引用的抽象性)。一个应用程序模块应当引出指向抽象数据类型的句柄(典型地应当定义为void * ),这样客户就只能使用此引用而绝对不能看到其中的数据域。然而在C++ 中,由于可以通过私有数据成员来引出指向类对象的指针,因此这样做已经不那么必要了。 |
pl | 一 “ 从 ”对象(A “plex” of objects )。这是简单数组(”rg” )之外的另一种选择,表示了使用plex 抽象以标准方式可变的数组(参见inc/msoalloc.h )。 |
mp | 用于将索引或者其它标量映射到值的数组。此前缀后面要加上索引和值的标识,如" mpchdx " 表示将字符值(作为数组索引)映射到该字符对应的dx 值上的数组。 |
V | 全局变量,总是第一个前缀。 |
除此之外,我们还可以在合适的时候添加下面的一些前缀到任何匈牙利命名前缀之前:
m_ | C++ 类的数据成员。 |
s_ | C++ 类的静态数据成员。 |
Mso | 引出的全局函数。 |
MSO | 引出的自定义类型。 |
mso | 引出的全局常量或者全局变量。 |
1.4 标准修饰符
大部分修饰符都按照该名字被使用的场合来定义,但是还是有一些预定义的标准修饰符如下:
First | 集合中的第一个元素或者第一个感兴趣的元素(如 pchFirst )。 |
Last | 集合中的最后一个原始或者最后一个感兴趣的元素(如pchLast )。当用作索引时,Last 表示最后一个合法的/ 期望的值,因此循环可以如下定义: |
Lim | 集合中元素的上限。与Last 不同,Lim 不表示合法值,Lim 是最后一个合法值加1 ,因此循环可以如下定义: |
Min | 集合中的最小元素,类似于First ,但是通常表示第一个合法值,而不仅仅是第一个要处理的值。 |
Max | 集合中元素的上限(和Lim 一样)。不幸的是,"Max" 的正常英语读法通常暗示了最后一个合法值,但是Max 修饰符不表示合法值,而是合法值加1 。和Lim 一样,Max 的典型用法如下: for (ich = ichMin; ich < ichMax; ich++) |
Mac | 类似于Max ,但是有时用于 “ 当前 ” 最大值会随着时间而改变的情况下。注意Mac 也是最后一个合法值加1 。 |
Mic | 类似于Min ,但有时用于“ 当前 ” 最小值会随着时间而改变的情况下。 |
T | 临时值。此修饰符可能被作为避免创建新的好名字的一种方法而被滥用,但是有时将其用于声明简单的临时值是适合的,如在经典的swap 操作中那样。 |
TT , T3 , 等等 | 在需要更多唯一名字的时候对 T = temporary 约定的进一步滥用。应当完全避免。 |
Sav | 用于保存值的临时值,以便将来恢复。例如: |
Null | 特定的0 值。虽然总是等于0 ,但是可用于文档化的目的(如hwndNull )。 |
Nil | 特定的非法值,不必要等于0 (可能是-1 或者任何其它值)。为了避免混淆,最好不要为同一类型同时定义Null 和Nil 值。 |
Src | 操作源,典型地用法是和Dest 配套使用,如: *pchDest = *pchSrc |
Dest | 操作目的,参见 Src 。 |