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

來源:互聯網
上載者: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.