码迷,mamicode.com
首页 > 其他好文 > 详细

匈牙利命名法

时间:2015-06-23 17:29:04      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

关于匈牙利命名法:(转自网上资源)  

前言

===============================================================================

    几年以前,Charles Simonyi(他后来成为微软的著名程序员)设计了一种以前缀为基础的命名方法,这种方法后来称为"匈牙利表示法"以记念他.他的思想是根据每个标识符所代表的含义给它一个前缀.微软后来采用了这个思想,给每个标识符一个前缀以说明它的数据类型.因此,整型变量的前缀是n,长整型变量是nl,字符型数组变量是ca,以及字符串(以空类型结尾的字符数组)sz为前缀.这些名字可能会非常古怪.比如说:lpszFoo表示"Foo"是一个指向以空字符为结尾的字符串的长整型指针.

    这种方法的优点是使人能够通过变量的名字来辨别变量的类型,而不比去查找它的定义.遗憾的是,这种方法不仅使变量名字非常绕口,而且使改变变量类型的工作变得十分艰巨.Windows3.1,整型变量为16为宽.如果我们在开始时采用了一个整型变量,但是在通过30---40个函数的计算之后,发现采用整型变量宽度不够,这时我们不仅要改变这个变量的类型,而且要改变这个变量在这30--40个函数中的名字.

    因为不切实际,除了一些顽固的Windows程序员外已经没有人再使用"匈牙利表示法".毫无疑问,在某种场合它依然存在,但大部分人现在已经抛弃它了.一般而言,输入前缀是一种糟糕的想法,因为它把变量于其类型紧紧地绑在了一起.

----------------------------------------------------------------------------------------------------------------------------

匈牙利命名法的优势:

    对于30行以下的函数,匈牙利方法一般有优势。尤其是对界面编程,有优势。但对于有强烈的算法要求、尤其是有很多抽象类型的C++程序,匈牙利方法简直是一个灾难。看你用在什么地方。现在有了很好的IDE工具,:VC,SourceInsight等,选中变量,会自动提示告诉你它的声明和定义,这样匈牙利命名法就没有很大的必要了.无非就是为了程序可读性较好.实际上良好的代码书写习惯比强制使用匈牙利命名法更重要.系统性。整体性。可读性。分类要清楚。要有注释!

    匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。它是由微软内部的一个匈牙利人发起使用的,结果它在微软内部逐渐流行起来

,并且推广给了全世界的Windows开发人员。下面将介绍匈牙利命名法,后面的例子里也会尽量遵守它和上面的代码风格。还是那句话,并不是要求所有的读者都要去遵守,但是希望读者作为一个现代的软件开发人员都去遵守它。

================================================================================

前缀       类型             中文说明

a        Array               数组

b         BOOL(int)             布尔(整数)

by       Unsigned Char(Byte)     无符号字符(字节)

c        Char             字符(字节)

cb       Count of Bytes         字节数

cr        Color Reference Value      颜色(参考)值

cx       Count of x(Short)        x的集合(短整数)

f      Flags(usually multiple bit values)   标志(一般是有多位的数值)

fn       Function             函数

g_       Global             全局的

h         Handle              句柄

i          Integer              整数

l           Long              长整数

lp       Long Pointer             长指针

m_     Data Member of a Class    一个类的数据成员

n       Short Integer           短整数

p       Pointer               指针

s       String               字符串

sz    Zero Terminated String       以零结尾的字符串

tm     Text Metric             文本规则

u     Unsigned Integer            无符号整数

ul    Unsigned Long(ULONG)       无符号长整数

w      WORD(Unsigned Short)          无符号短整数

x,y   x, y Coordinates (Short)         坐标值(短整数)

v         Void               空

==============================================================================

有关项目的全局变量用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量。

前缀         类型           例子

g_         全局变量        g_Servers

C         类或者结构体     CDocument, CPrintInfo

m_            成员变量      m_pDoc, m_nCustomers

==============================================================================

VC常用前缀列表:

前缀       类型         描述           例子

ch       char       8位字符         chGrade

ch       TCHAR     16Unicode集字符     chName

b        BOOL       布尔变量         bEnable

n        int         整型          nLength

n           UINT       无符整型         nLength

w       WORD     16位无符号整型        wPos

l         Long      32位有符号整型       lOffset

dw       DWORD         32位无符号整型      dwRange

p          *       指针变量,内存模块指针      pDoc

lp         Far*         长指针          lpDoc 

lpsz     LPSTR         32位字符串指针      lpszName

lpsz       LPCSTR     32位常量字符串指针      lpszName

lpsz            LPCTSTR      32Unicode集常量指针       lpszName

h      handle       Windows对象句柄      hWnd

lpfn     (*fn)()                  回调函数指针          lpfnAbort

=============================================================================

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
BOOL  布尔值   bEnable
 n  int  整型(其大小依赖于操作系统)   nLength
UINT  无符号值(其大小依赖于操作系统)   nHeight
WORD  16位无符号值   wPos
LONG  32位有符号整型   lOffset
dw  DWORD  32位无符号整型   dwRange
*    指针 pDoc
lp  FAR*  远指针   lpszName
 lpsz  LPSTR  32位字符串指针   lpszName
lpsz  LPCSTR  32位常量字符串指针   lpszName
 lpsz  LPCTSTR  如果_UNICODE定义,则为32位常量字符串指针  lpszName
handle  Windows对象句柄   hWnd
lpfn  callback  指向CALLBACK函数的远指针  

 

=============================================================================

前缀          符号类型            实例           范围

IDR_   不同类型的多个资源共享标识   IDR_MAIINFRAME     10x6FFF

IDD_   对话框资源           IDD_SPELL_CHECK    10x6FFF

HIDD_    对话框资源的Help上下文      HIDD_SPELL_CHECK    0x200010x26FF

IDB_   位图资源            IDB_COMPANY_LOGO      10x6FFF

IDC_   光标资源            IDC_PENCIL         10x6FFF

IDI_    图标资源            IDI_NOTEPAD              10x6FFF

ID_     来自菜单项或工具栏的命令      ID_TOOLS_SPELLING       0x80000xDFFF

HID_      命令Help上下文          HID_TOOLS_SPELLING     0x180000x1DFFF

IDP_      消息框提示            IDP_INVALID_PARTNO   80xDEEF

HIDP_    消息框Help上下文          HIDP_INVALID_PARTNO    0x300080x3DEFF

IDS_     串资源               IDS_COPYRIGHT       10x7EEF

IDC_     对话框内的控件           IDC_RECALC         80xDEEF

==============================================================================

应用程序符号命名规范

1). Microsoft MFC宏命名规范:

 名称            类型

 _AFXDLL    唯一的动态连接库(Dynamic Link LibraryDLL)版本

 _ALPHA     仅编译DEC Alpha处理器

 _DEBUG    包括诊断的调试版本

 _MBCS      编译多字节字符集

 _UNICODE     在一个应用程序中打开Unicode

 AFXAPI MFC   提供的函数

 CALLBACK     通过指针回调的函数

---------------------------------------------------------------------------------------------------------------------------

2). 库标识符命名法:

   标识符            值和含义

   u     ANSIN)或UnicodeU

   d        调试或发行:D = 调试,忽略标识符为发行。

----------------------------------------------------------------------------------------------------------------------------

3). 静态库版本命名规范:

     库           描述

 NAFXCWD.LIB   调试版本:MFC静态连接库

 NAFXCW.LIB     发行版本:MFC静态连接库

 UAFXCWD.LIB    调试版本:具有Unicode支持的MFC静态连接库

 UAFXCW.LIB        发行版本:具有Unicode支持的MFC静态连接库

----------------------------------------------------------------------------------------------------------------------------

4). 动态连接库命名规范:

   名称           类型

 _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

===============================================================================

MSDN中给出了一段遵守代码风格和匈牙利命名法的代码参考如下:

 1 #include "sy.h"  2 extern int *rgwDic;  3 extern int bsyMac;  4 struct SY *PsySz(char sz[])  5 {  6     char *pch;  7     int cch;  8     struct SY *psy, *PsyCreate();  9     int *pbsy; 10     int cwSz; 11     unsigned wHash=0; 12     pch=sz; 13     while (*pch!=0) 14         wHash=wHash<>11+*pch++; 15     cch=pch-sz; 16     pbsy=&rgbsyHash[(wHash&077777)%cwHash]; 17     for (; *pbsy!=0; pbsy = &psy->bsyNext) 18     { 19         char *szSy; 20         szSy= (psy=(struct SY*)&rgwDic[*pbsy])->sz; 21         pch=sz; 22         while (*pch==*szSy++) 23         { 24             if (*pch++==0) 25                 return (psy); 26         } 27     } 28     cwSz=0; 29     if (cch>=2) 30         cwSz=cch-2/sizeof(int)+1; 31     *pbsy=(int *)(psy=PsyCreate(cwSY+cwSz))-rgwDic; 32     Zero((int *)psy,cwSY); 33     bltbyte(sz, psy->sz, cch+1); 34     return(psy); 35 }

匈牙利命名法

标签:

原文地址:http://www.cnblogs.com/201112701206lee/p/4595634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!