變量命名規則------匈牙利命名規則!

幾年以前,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的集合(短整數)

  dw      DWORD   (unsigned long)                 雙字(無符號長整數)

  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 int                             短整數

  p       Pointer                               指針

  s       String                                字符串

  sz      Zero terminated String                以0結尾的字符串

  tm      Text metric                           文本規則

  u       Unsigned int                          無符號整數

  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       16位UNICODE類型字符       chName

b     BOOL       布爾變量       bEnabled

n     int    整型(其大小由操作系統決定)       nLength

n     UINT       無符號整型(其大小由操作系統決定)       nLength

w    WORD       16位無符號整型    wPos

l      LONG       32位有符號整型    lOffset

dw   DWORD       32位無符號整型       dwRange

p     *       Ambient memory model pointer 內存模塊指針,指針變量    pDoc

lp     FAR*       長指針       lpDoc

lpsz  LPSTR       32位字符串指針       lpszName

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

lpsz  LPCTSTR       32位UNICODE類型常量指針       lpszName

h     handle       Windows對象句柄       hWnd

lpfn  (*fn)()       回調函數指針 Callback Far pointer to CALLBACK function       lpfnAbort

Windows對象名稱縮寫:

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       hPalette;       CPalette*       pPalette;

HRGN     hRgn;       CRgn*       pRgn;

HMENU hMenu;       CMenu*       pMenu;

HWND    hCtl;       CStatic*       pStatic;

HWND    hCtl;       CButton*       pBtn;

HWND    hCtl;       CEdit*       pEdit;

HWND    hCtl;       CListBox*       pListBox;

HWND    hCtl;       CComboBox*       pComboBox;

VC常用宏定義命名列表:

前綴       符號類型       符號例子       範圍

IDR_      標識多個資源共享的類型       IDR_MAINFRAME       1~0x6FFF

IDD_      對話框資源(Dialog)       IDD_SPELL_CHECK       1~ 0x6FFF

HIDD_    基於對話框的上下文幫助       HIDD_SPELL_CHECK       0x20001~0x26FF

IDB_       位圖資源(Bitmap)       IDB_COMPANY_LOGO       1~0x6FFF

IDC_      光標資源(Cursor)       IDC_PENCIL    1~0x6FFF

IDI_       圖標資源(Icon)       IDI_NOTEPAD 1~0x6FFF

ID_、IDM_       工具欄或菜單欄的命令項       ID_TOOLS_SPELLING       0x8000~0xDFFF

HID_      命令上下文幫助       HID_TOOLS_SPELLING       0x18000~0x1DFFF

IDP_       消息框提示文字資源       IDP_INVALID_PARTNO       8~0xDFFF

HIDP_    消息框上下文幫助       HIDP_INVALID_PARTNO       0x30008~0x3DFFF

IDS_       字符串資源(String)       IDS_COPYRIGHT       1~0x7FFF

IDC_      對話框內的控制資源       IDC_RECALC   8~0xDFFF

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

MSDN中給出了一段遵守代碼風格和匈牙利命名法的代碼參考如下:

1   #include “sy.h”

2   extern int *rgwDic;

3   extern int bsyMac;

4   struct SY *PsySz(char sz[])

6   {

7           char *pch;

8       int cch;

9       struct SY *psy, *PsyCreate();

10      int *pbsy;

11      int cwSz;

12      unsigned wHash=0;

13      pch=sz;

14      while (*pch!=0)

15         wHash=wHash<>11+*pch++;

16      cch=pch-sz;

17      pbsy=&rgbsyHash[(wHash&077777)%cwHash];

18      for (; *pbsy!=0; pbsy = &psy->bsyNext)

19      {

20         char *szSy;

21         szSy= (psy=(struct SY*)&rgwDic[*pbsy])->sz;

22         pch=sz;

23         while (*pch==*szSy++)

24         {

25            if (*pch++==0)

26               return (psy);

27         }

28      }

29      cwSz=0;

30      if (cch>=2)

31         cwSz=cch-2/sizeof(int)+1;

32      *pbsy=(int *)(psy=PsyCreate(cwSY+cwSz))-rgwDic;

33      Zero((int *)psy,cwSY);

34      bltbyte(sz, psy->sz, cch+1);

35      return(psy);

36  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章