匈牙利表示法常用前缀
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。 举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为 Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代 码。 据说这种命名法是一位叫 Charles Simonyi 的匈牙利程序员发明的,后来他在微软呆了几年,于是这种命名法就通过微软的各种产品和文档资料向世界传播开了。现在,大部分程序员不管自己使用什么软件进 行开发,或多或少都使用了这种命名法。这种命名法的出发点是把变量名按:属性+类型+对象描述的顺序组合起来,以使程序员作变量时对变量的类型和其它属性 有直观的了解,下面是HN变量命名规范,其中也有一些是我个人的偏向: 属性部分 全局变量 g_ 常量 c_ c++类成员变量 m_ 静态变量 s_ 类型部分 指针 p 函数 fn 无效 v 句柄 h 长整型 l 布尔 b 浮点型(有时也指文件) f 双字 dw 字符串 sz 短整型 n 双精度浮点 d 计数 c(通常用cnt) 字符 ch(通常用c) 整型 i(通常用n) 字节 by 字 w 实型 r 无符号 u 描述部分 最大 Max 最小 Min 初始化 Init 临时变量 T(或Temp) 源对象 Src 目的对象 Dest 这里顺便写几个例子: hwnd : h 是类型描述,表示句柄, wnd 是变量对象描述,表示窗口,所以 hwnd 表示窗口句柄; pfnEatApple : pfn 是类型描述,表示指向函数的指针, EatApple 是变量对象描述,所以它表示 指向EatApple 函数的函数指针变量。 g_cch : g_ 是属性描述,表示全局变量,c 和 ch 分别是计数类型和字符类型,一起表示变量类 型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。 上面就是HN命名法的一般规则。 小结:匈牙利命名法 匈牙利命名法 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 -------------------------------------------------------------------------------- 抨击匈牙利命名法 匈牙利命名法是一种编程时的命名规范。命名规范是程序书写规范中最重要也是最富争议的地方,自 古乃兵家必争之地。命名规范有何用?四个字:名正言顺。用二分法,命名规范分为好的命名规范和坏的命名规范,也就是说名正言顺的命名规范和名不正言不顺的 命名规范。好的舞鞋是让舞者感觉不到其存在的舞鞋,坏的舞鞋是让舞者带着镣铐起舞。一个坏的命名规范具有的破坏力比一个好的命名规范具有的创造力要大得 多。 本文要证明的是:匈牙利命名法是一个坏的命名规范。本文的作用范围为静态强类型编程语言。本文的分析范本为C语言和C++语言。下文中的匈法为匈牙利命名法的简称。 一 匈牙利命名法的成本 匈法的表现形式为给变量名附加上类型名前缀,例如:nFoo,szFoo,pFoo,cpFoo分别表示整型变量,字符串型变量,指针型变量和常指针型变量。可以看出,匈法将变量的类型信息从单一地点 (声明变量处)复制到了多个地点(使用变量处),这是冗余法。冗余法的成本之一是要维护副本的一致性。这个成本在编写和维护代码的过程中需要改变变量的类 型时付出。冗余法的成本之二是占用了额外的空间。一个优秀的书写者会自觉地遵从一个法则:代码最小组织单位的长度以30个自然行以下为宜,如果超过50行 就应该重新组织。一个变量的书写空间会给这一法则添加不必要的难度。 二 匈牙利命名法的收益 这里要证明匈牙利命名法的收益是含糊的,无法预期的。 范本1:strcpy(pstrFoo,pcstrFoo2) Vs strcpy(foo,foo2) 匈法在这里有什么收益呢?我看不到。没有一个程序员会承认自己不知道strcpy函数的参数类型吧。 范本2:unknown_function(nFoo) Vs unknown_function(foo) 匈法在这里有什么收益呢?我看不到。对于一个不知道确定类型的函数,程序员应该去查看该函数的 文档,这是一种成本。使用匈法的唯一好处是看代码的人知道这个函数要求一个整型参数,这又有什么用处呢?函数是一种接口,参数的类型仅仅是接口中的一小部 分。诸如函数的功能、出口信息、线程安全性、异常安全性、参数合法性等重要信息还是必须查阅文档。 范本3:nFoo=nBar Vs foo=bar 匈法在这里有什么收益呢?我看不到。使用匈法的唯一好处是看代码的人知道这里发生了一个整型变 量的复制动作,听起来没什么问题,可以安心睡大觉了。如果他看到的是nFoo=szBar,可能会从美梦中惊醒。且慢,事情真的会是这样吗?我想首先被惊 醒的应该是编译器。另一方面,nFoo=nBar只是在语法上合法而已,看代码的人真正关心的是语义的合法性,匈法对此毫无帮助。另一方面,一个优秀的书 写者会自觉地遵从一个法则:代码最小组织单位中的临时变量以一两个为宜,如果超过三个就应该重新组织。结合前述第一个法则,可以得出这样的结论:易于理解 的代码本身就应该是易于理解的,这是代码的内建高质量。好的命名规范对内建高质量的助益相当有限,而坏的命名规范对内建高质量的损害比人们想象的要大。 三 匈牙利命名法的实施 这里要证明匈牙利命名法在C语言是难以实施的,在C++语言中是无法实施的。从逻辑上讲,对匈法的收益做出否定的结论以后,再来论证匈法的可行性,是画蛇添足。不过有鉴于小马哥曾让已射杀之敌死灰复燃,我还是再踏上一支脚为妙。 前面讲过,匈法是类型系统的冗余,所以实施匈法的关键是我们是否能够精确地对类型系统进行复制。这取决于类型系统的复杂性。 先来看看C语言: 1.内置类型:int,char,float,double 复制为 n,ch,f,d?好像没有什么问题。不过谁来告诉我void应该怎么表示? 2.组合类型:array,union,enum,struct 复制为 a,u,e,s?好像比较别扭。 这里的难点不是为主类型取名,而是为副类型取名。an表示整型数组?sfoo,sbar表示结构foo,结构bar?ausfoo表示联合结构foo数组?累不累啊。 3.特殊类型:pointer。pointer在理论上应该是组合类型,但是在C语言中可以认为是内置类型,因为C语言并没有非常严格地区分不同的指针类型。下面开始表演:pausfoo表示联合结构foo数组指针?ppp表示指针的指针的指针? 噩梦还没有结束,再来看看类型系统更阿为丰富的C++语言: 1.class:如果说C语言中的struct还可以用stru搪塞过去的话,不要梦想用 cls来搪塞C++中的class。严格地讲,class根本就并不是一个类型,而是创造类型的工具,在C++中,语言内置类型的数量和class创造的 用户自定义类型的数量相比完全可以忽略不计。stdvectorFoo表示标准库向量类型变量Foo?疯狂的念头。 2.命名空间:boostfilesystemiteratorFoo,表示boost空间filesystem子空间遍历目录类型变量Foo?程序员要崩溃了。 3.模板:你记得std::map类型的确切名字吗?我是记不得了,好像超过255个字符,还是饶了我吧。 4.模板参数:template const T& max(const T& a, const T& b, BinaryPredicate comp) 聪明的你,请用匈法为T命名。上帝在发笑。 5.类型修饰:static,extern,mutable,register,volatile,const,short,long,unsigned 噩梦加上修饰是什么?还是噩梦。
匈牙利命名法
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。
举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成lblSwitchboard。可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。
这种命名技术是由一位能干的Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的,他出生在匈牙利。在 Microsoft 公司中和他一起工作的人被教会使用这种约定。这对他们来说一切都很正常。但对那些 Simonyi 领导的项目组之外的人来说却感到很奇特,他们认为这是死板的表达方式,甚至说带有这样奇怪的外观是因为它是用匈牙利文写的。从此这种命名方式就被叫做匈牙利命名法。
据说这种命名法是一位叫 Charles Simonyi 的匈牙利程序员发明的,后来他在微软呆了几年,于是
这种命名法就通过微软的各种产品和文档资料向世界传播开了。现在,大部分程序员不管自己使用
什么软件进行开发,或多或少都使用了这种命名法。这种命名法的出发点是把量名变按:属性+类型
+对象 描述的顺序组合起来,以使程序员作变量时对变量的类型和其它属性有直观的了解,下面
是HN变量命名规范,其中也有一些是我个人的偏向:
属性部分
全局变量
g_
常量
c_
c++类成员变量
m_
静态变量
s_
类型部分
指针
p
函数
fn
无效
v
句柄
h
长整型
l
布尔
b
浮点型(有时也指文件)
f
双字
dw
字符串
sz
短整型
n
双精度浮点
d
计数
c(通常用cnt)
字符
ch(通常用c)
整型
i(通常用n)
字节
by
字
w
实型
r
无符号
u
描述部分
最大
Max
最小
Min
初始化
Init
临时变量
T(或Temp)
源对象
Src
目的对象
Dest
这里顺便写几个例子:
hwnd : h 是类型描述,表示句柄, wnd 是变量对象描述,表示窗口,所以 hwnd 表示窗口句柄;
pfnEatApple : pfn 是类型描述,表示指向函数的指针, EatApple 是变量对象描述,所以它表示
指向 EatApple 函数的函数指针变量。
g_cch : g_ 是属性描述,表示全局变量,c 和 ch 分别是计数类型和字符类型,一起表示变量类
型,这里忽略了对象描述,所以它表示一个对字符进行计数的全局变量。
上面就是HN命名法的一般规则。
小结:匈牙利命名法
匈牙利命名法
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
这个是最全的,图片粘贴不上来,先贴个文字
http://hi.baidu.com/starwolf/blog/item/b7a56c97afe92a6a55fb96cc.html
http://hi.baidu.com/starwolf/blog/item/8441b8d3bd2606d8a9ec9acf.html
--------------------
匈牙利符号表示法(一)2008年11月08日 星期六 22:38如果你正在动作一个像Microsoft一样的公司,有几千个程序员都在干不同的项目,在某一点上就应当提出一个编写代码的标准方式。否则,结果将是一片混乱。因此一个名字叫Charles Simonyi的人被委托创立了一套编写Microsoft代码的规范。这个规范已经用作编写代码的基本指导说明书。所有Microsoft的API、界面、技术文件等等都采用这些规范。
这个规范通常被称为匈牙利符号表示法,可能是因为创立这个规范工作很长时间,弄得他饥肠辘辘的原因吧(英文中饥饿和匈牙利谐音),或者可能他是匈牙利人。对我们根本不知道,关键是你必须了解这个规范,以便于你能够阅读Microsoft代码。匈牙利符号表示法包括许多与下列命名有关的约定:
·变量
·函数
·类型和常量
·类
·参数
表 给出了匈牙利符号表示法使用的前缀代码。这些代码在大多数情况下一半用于前缀变量名,其他约定根据名称确定。其他解释可以参考本表。
表: 匈牙利符号表示法的前缀代码指导说明书
━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━
前缀 │数据类型(基本类型)
——————┼————————————————————————
c │字符
by │字节(无符号字符)
n │短整数和整数(表示一个数)
i │整数
x,y │短整数(通常用于x坐标和y坐标)
cx,cy │短整数(通常用于表示x和y的长度:c表示计数)
b │布尔型(整数)
w │UINT(无符号整数)和WORD(无符号字)
l │LONG(长整数)
dw │DWORD(无符号长整数)
fn │函数指针
s │串
sz,str│以0字节终止的字符串
lp │32位的长整数指针
h │编号(常用于表示Windows对象)
msg │消息
——————┴———————————————————————
变量的命名
应用匈牙利符号表示法,变量可用表2.1中的前缀代码来表示。另外,当一个变量是由一个或几个子名构成时,每一个子名都要以大写字母开头。下面是几个例子:
char *szFileName;//a nulla terminated string
int *lpiDate;//a 32-bit pointer to an int
BOOL bSemaphore;//a boolean value
WORD dwMaxCount;//a 32-bit unsigned WORD
尽管我了解一个函数的局部变量没有说明,但是也有个别表示全局变量:
int g_iXPos;//a global x-position
int g_iTimer;//a global y-position
char *g_szString;//a global NULL terminated string
总的来说,变量以g_开头,或者有时就只用g。
函数的命名
函数和变量命名方式相同,但是没有前缀。换句话说,子名的第一个字母要大写。下面是几个例子:
int PlotPixel(int ix,int iy,int ic);
void *MemScan(char *szString);
而且,下划线是非法的,例如,下面的函数名表示是无效的匈牙利符号表示法:
int Get_Pixel(int ix,int iy);
类型和常量的命名
所有的类型和常量都是大写字母,但名字中可以允许使用下划线。例如:
const LONG NUM_SECTORS = 100;//a C++ style constant
#define MAX_CELLS 64;//a C style constant
#define POWERUNIT 100;//a C style constant
typedef unsigned char UCHAR;//a user defined type
这儿并没有什么不同的地方——非常标准的定义。尽管大多数Microsoft程序员不使用下划线,但我还是喜欢用,因为这样能使名字更具有可读性。
C++ 在C++中,关键字const不止一个意思。在前面的代码行中,它用来创建一个常数变量。这和#define相似,但是它增加了类型信息这个特性,const不仅仅像#define一样是一个简单的预处理文本替换,而且更像是一个变量,它允许编译器进行类型检查和替换。
类的命名
类命名的约定可能要麻烦一点。但我也看到有很多人在使用这个约定,并独立地进行补充。不管怎样说,所有C++的类必须以大写C为前缀,类名字的每一个子名的第一个字母都必须大写。下面是几个例子:
class CVector
{
public
CVector();{ix=iy=yz=imagnitude = 0;}
CVector(int x,int y,int z){ix=x;iy=y;iz=z;}
.
.
private:
int ix,iy,iz;//the position of the vector
int imagnitude;//the magnitude of the vector
};
参数的命名
函数的参数命名和标准变量命名的约定相同,但也不总是如此。例如下面例子给出了一个函数定义:
UCHAR GetPixel(int x,int y);
这种情况下,更准确的匈牙利函数原型是:
UCHAR GetPixel(int ix,int iy);
但我认为这并没有什么两样。
最后,你甚至可能都看不到这些变量名,而仅仅看到类型,如下所示:
UCHAR GetPixel(int, int);
当然,这仅仅是原型使用的,真正的函数声明必须带有可赋值的变量名,这一点你已经掌握了。
注意:仅仅会读匈牙利符号表示并不代表你能使用它。实际上,我进行编程工作已经有20多年了,我也不准备为谁改变我的编程风格。因此,本书中的代码使用类匈牙利符号表示法的编码风格,这是Win32 API造成的,在其他位置将使用我自己的风格,必须注意的是,我使用的变量名的第一个字母没有大写,并且我还使用下划线。
规则1:对变量加前缀
始终在一个变量的前面加上一个或者多个小写字母来作为前缀,这些字母用来表示该变量的类型。在大多数情况下,这是变量类型的第一个字母,因此很容易记住应该使用哪一个字母。下面的示例显示了最常用的一些前缀。
规则2:标识状态变量
有些变量表示一个对象—如数据库、域或者控件的状态。它们甚至可能用来存储另一个变量的状态。告诉其他程序员一个变量正在监视某个对象的当前状态有助于他们看到该变量在程序中的重要性。你可以使用以下的三字符限定词来标识状态变量:
New
新状态
Sav
以保存状态
Tem
临时状态
规则3:使用标准限定词
标准限定词有助于其他人立即看出某个变量的用途。这不是该变量所包含的信息类型,而是关于该变量如何与其他变量相互作用的信息。例如,使用Clr限定词可以告诉查看者,这个变量是以某种方式与颜色一同使用的。甚至可以组合使用限定词以增强它们的效果并且说明该变量是如何使用的。例如,cClrCrs是一个可以决定显示器上光标颜色的字符变量。使用1~3个这样的限定词通常就可以足以说明变量的用途了。
Ar
数组
Msg
消息
Attr
属性
Name
名称
B
底部
Ntx
索引文件
Clr
颜色
R
右边
Col
列
Rec
记录编号
Crs
光标
Ret
返回值
Dbf
数据库文件
Scr
屏幕
F
第一个
Str
字符串
File
文件
T
顶部
Fld
字段
X
行
L
上一个/左边
Y
列
规则4:添加说明文字
一旦清晰地定义了变量的内容和用途,就可以使用一些说明文字来进一步说明其定义。例如,可能有一个长指针指向某个包含雇员名称的字符串:lpszEmpName。前两个字母(lp)指出这是一个长指针。接下来的两个字母(sz)指出这是一个以零(或者NULL)结尾的字符串。其余的字母(EmpName)指出这是一个雇员的名称。(请注意,在例中使用了标准限定词Name)。在一段代码中看到类似的变量名可以立即使你知道它所具有的含义。
规则5:创建一个以上的变量
在许多时候,使用一个变量将无法满足特定模块中的所有需求。在这些情况下,可能想要创建一个以上的该类型的变量,而且只需对它们编号即可。或许还可以使用某种编号指示符来指定其功能。
1,2,3
cSavClr1, cSavClr2等变量中的状态指针引用
Max
nFldMax中的严格上限,字段的最大编号
Min
nRecMin中的严格下限,记录的最小编号
Ord
某种类型的序号
命名法的相关内容
称为“某烷”。 螺环烷烃 1.螺环烷烃中,两个环公用的一个四级碳原子称为螺原子;2.编号从小环开始,1号碳是紧挨螺原子的一个碳原子;3.命名时,先称“螺”字,然后在中括号里标明各个环上非螺原子的个数,数字之间用点分隔;4.最后,按照环系上碳原子的个数,称为“某烷”。5.多环...
卜琳康妇: 命名规则比较著名的命名规则当推Microsoft公司的“匈牙利”法,该命名规则的主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”.例如所有的字符变量均以ch为前缀,若是指针变量则追加前缀p.如果一个变量由ppch开头,...
长兴县13893648601: 几种常见的程序设计中命名规则 - ?
卜琳康妇: 匈牙利命名法 驼峰命名法 帕斯卡命名法 下划线命名法
长兴县13893648601: c++中的m - pMainWnd,m - nCmdShow,n - pMainWnd,SW - SHOW中的m - p,m - n,n - p,SW分别代表什么意思? - ?
卜琳康妇: 前面三个是匈牙利命名法,用前缀表示该变量的属性 m_表示该变量是类的成员变量(member) n表示该变量是整型(int) p表示该变量是指针型(pointer) SW_SHOW是一个常量宏,SW表示它被用于系统函数ShowWindow的参数
长兴县13893648601: 编程中经常看到类似cbSize,cb这样的前缀的英文全称是什么,或者他被定义成什么 - ?
卜琳康妇: count of byte 字节数 匈牙利表示法Examples bBusy : boolean chInitial : char cApples : count of items dwLightYears : double word (systems) fBusy : boolean (flag) nSize : integer (systems) or count (application) iSize : integer (systems) or index (...
长兴县13893648601: m - pMainWnd一般表示什么意思 - ?
卜琳康妇: 这是一个匈牙利表示法.m_p开头表示该变量为某个类的成员变量,变量类型为某种指针.MainWnd一般表示主框架窗口,那么这个变量一般用在XXXApp类中(XXX为你的工程名)就是主框架窗口指针.Win32asm源程序风格采用匈牙利表示...
长兴县13893648601: vb变量的前缀szstr是什么意思 - ?
卜琳康妇: 微软程序员以前在C/C++中使用Hungarian Notation(匈牙利命名法)来表示变量名:以小写的字母开头来表示该变量的类型.比如: h表示handle,c表示char,i表示int,dw表示DWORD(unsigned long),s表示string,fn表示function,sz表示string ...
长兴县13893648601: 类文件名的首字母是否一定要大写,为什么 - ?
卜琳康妇: 不是. 1 三种流行的命名法则目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法.(1)驼峰命令法.正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和...
长兴县13893648601: c的变量的命名规范 - ?
卜琳康妇: 命名规则:1、变量名的命名规则 ①、变量的命名规则要求用“匈牙利法则”.即开头字母用变量的类型,其余部分用变量的英文意思或其英文意思的缩写,尽量避免用中文的拼音,要求单词的第一个字母应大写. 即: 变量名=变量类型+变量...
长兴县13893648601: 汇编变量名前通常加的sz是什么意思? - ?
卜琳康妇: 匈牙利表示法 为了纪念匈牙利籍的Microsoft程序员Charles Simonyi b 表示byte w 表示word dw 表示dword h 表示句柄 lp 表示指针 sz 表示以0结尾的字符串 lpsz 表示指向0结尾的字符串的指针 f 表示浮点数 st 表示一个数据结构
长兴县13893648601: 关于变量名的前缀m__?
卜琳康妇: m_ 是member的缩写,类成员加m_是个编码风格,没有z_这种乱加的,可读性变差了 不同的公司有不同的规范,不过一般遵循匈牙利规则的比较多