匈牙利命名法规范
匈牙利命名法是电脑程序设计中的一种变量命名规则,此命名法又可细分为:系统匈牙利命名法和匈牙利应用命名法。
系统命名法与应用命名法的区别在于前缀的目的。
在系统匈牙利命名法中,前缀代表了变量的实际数据类型。例如:
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 |
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 |
名称 | 类型 |
_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 所提供的函数 |
类型 | 定义描述 |
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 |
匈牙利命名法规范
匈牙利命名法是电脑程序设计中的一种变量命名规则,此命名法又可细分为:系统匈牙利命名法和匈牙利应用命名法。
系统命名法与应用命名法的区别在于前缀的目的。
在系统匈牙利命名法中,前缀代表了变量的实际数据类型。例如:
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 |
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 |
名称 | 类型 |
_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 所提供的函数 |
类型 | 定义描述 |
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 |