Visual C++中各种字母的徽标含义
匈牙利命名法是编程中的命名标准。基本原理是:变量名=属性+类型+对象描述,其中每个对象的名称都要求有明确的含义,可以取对象的全名或部分名称。命名要以容易记忆和理解为原则。确保名称的一致性非常重要。
例如,表单的名称在匈牙利命名法中可以缩写为frm,当表单变量被称为Switchboard时,变量的全名应该是frmSwitchboard。这样从变量名就很容易看出,切换面板是一个窗体。同样,如果变量类型是一个标签,它应该被命名为lblSwitchboard。可以看出,匈牙利命名法非常好记,并且使得变量名非常清晰易懂,增强了代码的可读性,方便了程序员之间的交流。
据说这个术语是由一位名叫查尔斯·西蒙尼的匈牙利程序员发明的。后来他在微软呆了几年,于是这个命名法通过微软的各种产品和文档流传到了全世界。现在,大多数程序员在某种程度上使用这种命名法,不管他们使用什么软件进行开发。这种命名方法的出发点是按照:属性+类型+对象描述的顺序组合变量名,让程序员在制作变量时对变量的类型和其他属性有一个直观的认识。以下是HN变量命名规范,其中一些是我的个人喜好:
属性部分
全局变量
g_
常数
c_
C++类成员变量
m_
静态变量
s_
类型部分
针
p
功能
【数学】函数
无效
v
处理
h
长整数
l
布尔
b
浮点类型(有时也称为文件)
f
双字
发展的宽度(Developed Width的缩写)
字符串
尺码(size的简写)
短整数
n
双精度浮点
d
数数
c(通常是cnt)
性格;角色;字母
Ch(通常为c)
整数
I(通常为n)
字节
经过
单词
w
实型
r
没有符号
u
描述部分
最高的
最大
最低限度
福建话
初始化
初始化
临时变量
温度
源对象
科学研究委员会
目标对象
建筑环境及HVAC系统模拟的软件平台
这里顺便举几个例子:
Hwnd: h是类型描述,表示句柄,wnd是变量对象描述,表示窗口,所以Hwnd表示窗口句柄;
PFNeatapple: PFN是类型描述,意思是指向函数的指针,eatapple是变量对象描述,所以意思是。
指向EatApple函数的函数指针变量。
G _ Cch: G _是属性描述,代表一个全局变量,C和ch分别是计数型和字符型,共同代表一个变量类。
类型,其中对象描述被忽略,因此它表示一个计算字符数的全局变量。
以上是HN命名法的一般规则。
概要:匈牙利命名法
匈牙利命名法
MFC,句柄,控件和结构命名规范窗口类型示例变量MFC类示例变量
HWND hWndCWnd * pWnd
HDLG hDlg;CDialog * pDlg
HDC hDCCDC * pDC
HGDIOBJ hGdiObjCGdiObject * pGdiObj
HPEN hPen;CPen * pPen
HBRUSH hBrushCBrush * pBrush
HFONT hFontCFont * pFont
HBITMAP hBitmapCBitmap * pBitmap
HPALETTE hPaltteCPalette * pPalette
HRGN hRgnCRgn * pRgn
HMENU hMenuCMenu * pMenu
HWND hCtlCState * pState
HWND hCtlCButton * pButton
HWND hCtlCEdit * pEdit
HWND hCtlCListBox * pListBox
HWND hCtlCComboBox * pComboBox
HWND hCtlCScrollBar * pScrollBar
HSZ hszStr;CString pStr
点pt;CPoint角;
尺寸大小;CSize大小;
RECT矩形;CRect rect
通用前缀命名规范前缀类型示例
c类或结构CDocument,CPrintInfo
M_成员变量m_pDoc,m _ n客户
变量命名规范前缀类型描述实例
Ch char 8位字符chGrade
Ch TCHAR如果定义了_UNICODE,它就是16位字符chName。
布尔型
N int integer(其大小取决于操作系统)nLength
取消无符号值(其大小取决于操作系统)nHeight
w字16位无符号值wPos
长32位有符号整数l偏移量
32位无符号整数
P *指针pDoc
Lp远*远指针lpszName
32位字符串指针
32位常量字符串指针
如果由_UNICODE定义,Lpsz LPCTSTR是32位常量字符串指针lpszName。
窗口对象句柄
Lpfn CALLBACK是一个指向回调函数的远指针。
前缀符号类型实例范围
IDR_多个不同类型的资源* * *享受frame1 ~ 0x6fff中的ID IDR _ mai。
IDD_ dialog资源IDD _ spell _ check1 ~ 0x6fff
HIDD_对话资源的帮助上下文hidd _ spell _ check 0x 20001 ~ 0x 26 ff
IDB_位图资源IDB _ company _ logo1 ~ 0x6fff
IDC_ cursor资源IDC _ pencil1 ~ 0x6fff
IDI_图标资源idi _记事本1 ~ 0x6fff
ID_命令ID来自菜单项或toolbar _ Tools ID _ Tools _ SPELLING 0x 8000 ~ 0x dfff
HID_ command帮助上下文HID _ tools _ spelling 0x 18000 ~ 0x 1 dfff
IDP_ message box提示IDP _ IDP _ INVALID _ part no . 8 ~ 0x deef。
HIDP_消息框帮助上下文hidp _ invalid _ part no 0x 30008 ~ 0x 3 deff
IDS_ string资源ids _ copyright 1 ~ 0x7eef
IDC_对话框中的控件IDC_RECALC 8~0xDEEF
Microsoft MFC宏命名规范名称类型
_AFXDLL的独特版本的动态链接库(DLL)。
_ALPHA只编译DEC Alpha处理器。
_DEBUG包括诊断的调试版本。
_MBCS编译多字节字符集
_UNICODE在应用程序中打开UNICODE。
AFXAPI MFC提供的函数
回调由指针回调的函数。
库标识符命名标识符值和含义
U ANSI(N)或Unicode(U)
d调试或发布:D =调试;忽略已发布的标识符。
静态库版本命名规范库描述
NAFXCWD的调试版本。LIB: MFC静态连接库
NAFXCW。LIB分发:MFC静态连接库
UAFXCWD的调试版本。LIB:支持Unicode的MFC静态连接库
UAFXCW。LIB版本:支持Unicode的MFC静态连接库。
动态链接库命名规范名称类型
_AFXDLL动态链接库(DLL)的唯一版本
windows提供的Winapi函数
Windows.h中新的命名规范类型定义描述
WINAPI在API声明中使用FAR PASCAL位置。如果您正在使用导出的API填充点编写DLL,则可以在自己的API中使用此类型。
CALLBACK在应用程序回调例程(如窗口和对话框)中使用FAR PASCAL的位置。
LPCSTR与LPSTR相同,只是LPCSTR用于只读字符串指针,其定义类似(const char FAR*)。
UINT可移植无符号整数类型,其大小由主机环境决定(Windows NT和Windows 9x为32位);它与无符号int同义。
LRESULT windower的返回值类型。
lParam声明LPARAM使用的类型,这是窗口程序的第四个参数。
wParam声明WPARAM使用的类型,这是窗口程序的第三个参数。
LPVOID是一种通用指针类型,与(void *)相同,可以代替LPSTR使用。
-
攻击匈牙利命名法
匈牙利命名法是编程中的命名标准。命名规范是编程规范中最重要也是最有争议的地方,自古以来就是兵家必争之地。命名约定有什么用?四个字:有理有据。通过二分法,命名规范可以分为好的命名规范和坏的命名规范,也就是说有理有据的命名规范和有理有据的命名规范。好鞋是让舞者感觉隐形的鞋,坏鞋是让舞者戴着镣铐跳舞。一个坏的命名约定比一个好的命名约定更具破坏性。
本文想证明的是匈牙利命名法是一个不好的命名标准。本文的范围是静态强类型编程语言。本文的分析模板是C语言和C++语言。匈牙利法律在下面是匈牙利命名法的缩写。
匈牙利命名法的费用
匈牙利法的形式是在变量名前面加上类型名,比如nfoo,szfoo,pfoo,cpfoo分别代表整型变量,字符串变量,指针变量,常量指针变量。可以看出,匈牙利法将变量的类型信息从单个地方(声明变量的地方)复制到多个地方(使用变量的地方),这是一种冗余的方法。冗余方法的成本之一是维护副本的一致性。当在编写和维护代码的过程中需要改变变量的类型时,就要付出这种代价。冗余方法的第二个代价是占用额外的空间。一个好的写作者会自觉遵守一个规则:代码的最小组织单位长度要小于30个自然行,超过50行就要重新组织。变量的书写空间会给这条规则增加不必要的难度。
二、匈牙利命名法的好处
这里证明了匈牙利命名法的好处是模糊的,不可预测的。
模板1: strcpy (pstrfoo,pcstrfoo2)与strcpy (foo,foo2)
匈牙利和法国在这里有什么好处?我看不到。没有程序员会承认自己不知道strcpy函数的参数类型。
模板2:未知函数(nfoo)与未知函数(foo)
匈牙利和法国在这里有什么好处?我看不到。对于一个不知道确定类型的函数,程序员要查函数的文档,这是一个成本。使用匈牙利方法的唯一好处是,看代码的人都知道这个函数需要一个整型参数。这有什么用?函数就是一个接口,参数的类型只是接口的一小部分。函数、退出信息、线程安全、异常安全、参数合法性等重要信息。还是要咨询的。
模型3: nfoo = nbar vs foo = bar
匈牙利和法国在这里有什么好处?我看不到。用匈牙利法的唯一好处就是看代码的人知道这里有一个整数变量的副本,听起来没问题,可以安心睡觉了。如果他看到nFoo=szBar,他可能会从美梦中醒来。等一下,真的是这样吗?我觉得应该先唤醒编译器。另一方面,nFoo=nBar只是语法上合法。看代码的人真正关心的是语义的合法性,这对匈牙利和法国没有帮助。另一方面,一个优秀的作家会有意识地遵循一个规则:代码的最小组织单元中有一到两个临时变量是合适的,超过三个就要重组。结合上面提到的第一条规则,我们可以得出这样的结论:容易理解的代码,其本身也应该是容易理解的,这是代码内置的高质量。好的命名约定对内置建筑高质量的帮助有限,而不好的命名约定对内置建筑高质量的危害比人们想象的更大。
第三,匈牙利命名法的实施
需要证明匈牙利命名法很难用C语言实现,也不可能用C++语言实现。从逻辑上讲,在对匈牙利法律的好处做出否定的结论之后,再去论证匈牙利法律的可行性是多余的。不过,既然马克曾经复活过被枪毙的敌人,我还是再踏上一脚吧。
如前所述,匈牙利法律是类型系统的冗余,所以实现匈牙利法律的关键是我们能否准确地复制类型系统。这取决于类型系统的复杂程度。
让我们来看看C语言:
1.内置类型:int,char,float,double复制为n,ch,f,d?好像没什么问题。但是谁能告诉我虚空应该说什么?
2.组合类型:数组、联合、枚举、结构复制为a、u、e、s?好像很尴尬。
这里的难点不是命名主类型,而是命名子类型。An代表整数数组?Sfoo,sbar代表结构foo,结构bar?Ausfoo代表联合结构foo阵列?你累了吗?
3.特殊类型:指针。指针理论上应该是组合类型,但在C语言中可以认为是内置类型,因为C语言对不同指针类型的区分不是很严格。开始表演吧:pausfoo代表联合结构foo数组指针?Ppp代表指针指针。指针?
噩梦还没有结束。让我们来看看具有更丰富类型系统的C++语言:
1.class:如果C语言中的struct可以用来搪塞过去,那就别做梦用cls来搪塞C++中的class了。严格来说,类根本不是类型,而是创建类型的工具。在C++中,与class创建的用户定义类型的数量相比,语言内置类型的数量完全可以忽略不计。StdvectorFoo代表标准库向量类型变量Foo?疯狂的想法。
2.命名空间:boostfilesystemiteratorFoo,表示boost空间的文件系统子空间遍历目录类型变量Foo?程序员要崩溃了。
3.模板:还记得STD:: Map吗
4.模板参数:模板
5.类型修改:static,extern,mutable,register,volatile,const,short,long,unsigned梦魇加修改?还是噩梦。
WM是Windows消息,Windows消息。