匈牙利命名法

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 LibraryDLL )版本

_ALPHA

仅编译DEC Alpha 处理器

_DEBUG

包括诊断的调试版本

_MBCS

编译多字节字符集

_UNICODE

在一个应用程序中打开Unicode

AFXAPI

MFC 提供的函数

CALLBACK

通过指针回调的函数

库标识符命名法

标识符

值和含义

u

ANSI N )或UnicodeU

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 NTWindows 9x32 位);它是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 " 应当是一个函数的名字,该函数将使用类型为HwndXY 的参数来初始化一个" 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+2CHAR

chw, wt, wz, wtz

ch szststz 的宽字符( 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) pointerhuge 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 表示最后一个合法的/ 期望的值,因此循环可以如下定义:
for (ich = ichFirst; ich <= ichLast; ich++)

Lim

集合中元素的上限。与Last 不同,Lim 不表示合法值,Lim 是最后一个合法值加1 ,因此循环可以如下定义:
for (ich = ichFirst; ich < ichLim; ich++)

Min

集合中的最小元素,类似于First ,但是通常表示第一个合法值,而不仅仅是第一个要处理的值。

Max

集合中元素的上限(和Lim 一样)。不幸的是,"Max" 的正常英语读法通常暗示了最后一个合法值,但是Max 修饰符不表示合法值,而是合法值加1 。和Lim 一样,Max 的典型用法如下:

for (ich = ichMin; ich < ichMax; ich++)
Max 的使用一定要非常小心。

Mac

类似于Max ,但是有时用于 “ 当前 ” 最大值会随着时间而改变的情况下。注意Mac 也是最后一个合法值加1

Mic

类似于Min ,但有时用于“ 当前 ” 最小值会随着时间而改变的情况下。

T

临时值。此修饰符可能被作为避免创建新的好名字的一种方法而被滥用,但是有时将其用于声明简单的临时值是适合的,如在经典的swap 操作中那样。

TT , T3 , 等等

在需要更多唯一名字的时候对 T = temporary 约定的进一步滥用。应当完全避免。

Sav

用于保存值的临时值,以便将来恢复。例如:
hwndSav = hwnd; ...; hwnd = hwndSav;

Null

特定的0 值。虽然总是等于0 ,但是可用于文档化的目的(如hwndNull )。

Nil

特定的非法值,不必要等于0 (可能是-1 或者任何其它值)。为了避免混淆,最好不要为同一类型同时定义NullNil 值。

Src

操作源,典型地用法是和Dest 配套使用,如:

*pchDest = *pchSrc

Dest

操作目的,参见 Src

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值