變數命名規則——匈牙利命名規則!

來源:互聯網
上載者:User

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

幾年以前,Charles Simonyi(他後來成為微軟的著名程式員)設計了一種以首碼為基礎的命名方法,這種方法後來稱為"匈牙利標記法"以記念他.他的思想是根據每個標識符所代表的含義給它一個首碼.微軟後來採用了這個思想,給每個標識符一個首碼以說明它的資料類型.因此,整型變數的首碼是n,長整型變數是nl,字元型陣列變數是ca,以及字串(以空類型結尾的字元數組)以sz為首碼.這些名字可能會非常古怪.比如說:lpszFoo表示"Foo"是一個指向以Null 字元為結尾的字串的長整型指標.

 

這種方法的優點是使人能夠通過變數的名字來辨別變數的類型,而不比去尋找它的定義.遺憾的是,這種方法不僅使變數名字非常繞口,而且使改變變數類型的工作變得十分艱巨.在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  }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.