匈牙利命名法规范

匈牙利命名法是电脑程序设计中的一种变量命名规则,此命名法又可细分为:系统匈牙利命名法匈牙利应用命名法

系统命名法与应用命名法的区别在于前缀的目的。

在系统匈牙利命名法中,前缀代表了变量的实际数据类型。例如:

  • lAccountNum:变量是一个长整数("l");
  • arru8NumberList:变量是一个无符号8位整型数组("arru8");
  • szName:变量是一个零结束字符串("sz"),这是西蒙尼最开始建议的前缀之一。

匈牙利应用命名法不表示实际数据类型,而是给出了变量目的的提示,或者说它代表了什么。

  • rwPosition:变量代表一个("rw")。
  • usName:变量代表一个非安全字符串("us"),需要在使用前处理。
  • strName:变量代表一个包含名字的字符串("str")但是没有指明这个字符串是如何实现的。

西蒙尼建议的大多数前缀都是自然语义的,但不是所有。下面几个是来自原始论文的:

  • pX是指向另一个X类型的指针,这包含非常少的语义信息。
  • d是一个前缀表示两个值的区别,例如,dY可能代表一个图形沿Y轴的距离,而一个仅仅叫做y的变量可能是一个绝对坐标。这完全是自然语义的。
  • sz是一个无结束或零结束的字符串。在C中,这包含一些语义信息,因为它不是很明确一个char*类型的变量是一个指向单个字符的指针,还是一个字符数组,或是一个零结束字符串。
  • w标记一个变量是一个字。这基本上没有包含什么语义信息,因此大概会被当成是系统命名法。
  • b标记了一个字节,和w对比可能有一些语义信息,因为C语言中,只有字节大小的数据是char型的,因此这些有时候被用来保存数值。这个前缀也许可以明确某个变量保存的是应该被看作是字母(或更一般的字符)的数值还是一个数字。

由于这种命名法通常使用小写字母开头用来助记,但是并没有对助记符本身作规定。有几种被广泛使用的习惯(见下面的示例),但是任意字母组合都可以被使用,只要它们在代码主体中保持一致就可以了。

在使用匈牙利系统命名法的代码中有时候也可能包含系统匈牙利命名法,即在描述被单独以类型方式定义的变量时使用。

 

变量(还包括宏)的命名规则,比较系统和彻底的有 Windows 编程中用到的匈牙利命名法。匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先 m_ (成员变量),再指针,再简单数据类型,再其他。例如: m_lpszStr, 表示指向一个以 0 字符结尾的字符串的长指针成员变量。
有关匈牙利命名法的一点有意思的说明是它的名字的由来。这种命名技术是由一位能干的 Microsoft 程序员查尔斯 · 西蒙尼 (Charles Simonyi) 提出的,他出生在匈牙利。在 Microsoft 公司中和他一起工作的人被教会使用这种约定。这对他们来说一切都很正常。但对那些 Simonyi 领导的项目组之外的人来说却感到很奇特,他们认为这是死板的表达方式,甚至说代有这样奇怪的外观是因为它是用匈牙利文写的。从此这种命名方式就被叫做匈牙利命名法。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。
匈牙利命名法中常用的小写字母的前缀

前  缀
类  型
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 的命名空间相冲突即可。
1.
有意识的为变量名、宏名加上本模块的关键字,就不至于和其它模块、系统 API 的命名空间相冲突;例如 : 宏的名称过短,如: DEBUG; _DEBUG ,很可能和别的模块,系统模块相冲突;
2.
局部变量尤其是循环变量外,使用约定俗成的 i,j,k ,没有问题;
3.
宏、常量、枚举 enum ,全部用大写字母;
4.
全局变量加上前缀 "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

 

你可能感兴趣的:(匈牙利命名法规范)