幾年以前,Charles Simonyi(他後來成爲微軟的著名程序員)設計了一種以前綴爲基礎的命名方法,這種方法後來稱爲"匈牙利表示法"以記念他.他的思想是根據每個標識符所代表的含義給它一個前綴.微軟後來採用了這個思想,給每個標識符一個前綴以說明它的數據類型.因此,整型變量的前綴是n,長整型變量是nl,字符型數組變量是ca,以及字符串(以空類型結尾的字符數組)以sz爲前綴.這些名字可能會非常古怪.比如說:lpszFoo表示"Foo"是一個指向以空字符爲結尾的字符串的長整型指針.
這種方法的優點是使人能夠通過變量的名字來辨別變量的類型,而不比去查找它的定義.遺憾的是,這種方法不僅使變量名字非常繞口,而且使改變變量類型的工作變得十分艱鉅.在Windows3.1中,整型變量爲16爲寬.如果我們在開始時採用了一個整型變量,但是在通過30---40個函數的計算之後,發現採用整型變量寬度不夠,這時我們不僅要改變這個變量的類型,而且要改變這個變量在這30--40個函數中的名字.
匈牙利命名法是微軟推廣的一種關於變量、函數、對象、前綴、宏定義等各種類型的符號的命名規範。匈牙利命名法的主要思想是:在變量和函數名中加入前綴以增進人們對程序的理解。它是由微軟內部的一個匈牙利人發起使用的,結果它在微軟內部逐漸流行起來,並且推廣給了全世界的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 布爾變量 bEnable
n int 整型 nLength
n UINT 無符整型 nLength
w WORD 16位無符號整型 wPos
l Long 32位有符號整型 lOffset
dw DWORD 32位無符號整型 dwRange
p * 指針變量,內存模塊指針(Ambient memory model point) 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
匈牙利命名法
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;
前綴 符號類型 實例 範圍
IDR_ 不同類型的多個資源共享標識 IDR_MAIINFRAME 1~0x6FFF
IDD_ 對話框資源 IDD_SPELL_CHECK 1~0x6FFF
HIDD_ 對話框資源的Help上下文 HIDD_SPELL_CHECK 0x20001~0x26FF
IDB_ 位圖資源 IDB_COMPANY_LOGO 1~0x6FFF
IDC_ 光標資源 IDC_PENCIL 1~0x6FFF
IDI_ 圖標資源 IDI_NOTEPAD 1~0x6FFF
ID_ 來自菜單項或工具欄的命令 ID_TOOLS_SPELLING 0x8000~0xDFFF
HID_ 命令Help上下文 HID_TOOLS_SPELLING 0x18000~0x1DFFF
IDP_ 消息框提示 IDP_INVALID_PARTNO 8~0xDEEF
HIDP_ 消息框Help上下文 HIDP_INVALID_PARTNO 0x30008~0x3DEFF
IDS_ 串資源 IDS_COPYRIGHT 1~0x7EEF
IDC_ 對話框內的控件 IDC_RECALC 8~0xDEEF
應用程序符號命名規範
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