匈牙利命名法規範

匈牙利命名法是電腦程序設計中的一種變量命名規則,此命名法又可細分爲:系統匈牙利命名法匈牙利應用命名法

系統命名法與應用命名法的區別在於前綴的目的。

在系統匈牙利命名法中,前綴代表了變量的實際數據類型。例如:

  • lAccountNum:變量是一個長整數("l");
  • arru8NumberList:變量是一個無符號8位整型數組("arru8");
  • szName:變量是一個零結束字符串("sz"),這是西蒙尼最開始建議的前綴之一。

匈牙利應用命名法不表示實際數據類型,而是給出了變量目的的提示,或者說它代表了什麼。

  • rwPosition:變量代表一個("rw")。
  • usName:變量代表一個非安全字符串("us"),需要在使用前處理。
  • strName:變量代表一個包含名字的字符串("str")但是沒有指明這個字符串是如何實現的。

西蒙尼建議的大多數前綴都是自然語義的,但不是所有。下面幾個是來自原始論文的:

  • pX是指向另一個X類型的指針,這包含非常少的語義信息。
  • d是一個前綴表示兩個值的區別,例如,dY可能代表一個圖形沿Y軸的距離,而一個僅僅叫做y的變量可能是一個絕對座標。這完全是自然語義的。
  • sz是一個無結束或零結束的字符串。在C中,這包含一些語義信息,因爲它不是很明確一個char*類型的變量是一個指向單個字符的指針,還是一個字符數組,或是一個零結束字符串。
  • w標記一個變量是一個字。這基本上沒有包含什麼語義信息,因此大概會被當成是系統命名法。
  • b標記了一個字節,和w對比可能有一些語義信息,因爲C語言中,只有字節大小的數據是char型的,因此這些有時候被用來保存數值。這個前綴也許可以明確某個變量保存的是應該被看作是字母(或更一般的字符)的數值還是一個數字。

由於這種命名法通常使用小寫字母開頭用來助記,但是並沒有對助記符本身作規定。有幾種被廣泛使用的習慣(見下面的示例),但是任意字母組合都可以被使用,只要它們在代碼主體中保持一致就可以了。

在使用匈牙利系統命名法的代碼中有時候也可能包含系統匈牙利命名法,即在描述被單獨以類型方式定義的變量時使用。

 

變量(還包括宏)的命名規則,比較系統和徹底的有 Windows 編程中用到的匈牙利命名法。匈牙利命名法通過在變量名前面加上相應的小寫字母的符號標識作爲前綴,標識出變量的作用域,類型等。這些符號可以多個同時使用,順序是先m_(成員變量),再指針,再簡單數據類型,再其他。例如:m_lpszStr, 表示指向一個以0字符結尾的字符串的長指針成員變量。
有關匈牙利命名法的一點有意思的說明是它的名字的由來。這種命名技術是由一位能幹的 Microsoft 程序員查爾斯·西蒙尼(Charles Simonyi) 提出的,他出生在匈牙利。在 Microsoft 公司中和他一起工作的人被教會使用這種約定。這對他們來說一切都很正常。但對那些 Simonyi 領導的項目組之外的人來說卻感到很奇特,他們認爲這是死板的表達方式,甚至說代有這樣奇怪的外觀是因爲它是用匈牙利文寫的。從此這種命名方式就被叫做匈牙利命名法。匈牙利命名法關鍵是:標識符的名字以一個或者多個小寫字母開頭作爲前綴;前綴之後的是首字母大寫的一個單詞或多個單詞組合,該單詞要指明變量的用途。
匈牙利命名法中常用的小寫字母的前綴

前  綴
類  型
a
數組 (Array)
b
布爾值 (Boolean)
by
字節 (Byte)
c
有符號字符 (Char)
cb
無符號字符 (Char Byte,沒有多少人用)
cr
顏色參考值 (ColorRef)
cx,cy
座標差(長度 ShortInt
dw
Double Word
fn
函數
h
Handle
i
整型
l
長整型 (Long Int)
lp
Long Pointer
m_
類的成員
n
短整型 (Short Int)
np
Near Pointer
p
Pointer
s
字符串型
sz
null做結尾的字符串型 (String with Zero End)
w
Word

但是在任何情況下,都硬性規定使用匈牙利命名法是迂腐的。尤其是 Unix 編程,在使用沒有變量名、關鍵字自動補齊功能的編輯器,如 vi 下,去敲入大小寫混合的變量名是痛苦的。其實只要注意兩個原則:1) 含義清晰,不易混淆; 2) 不和其它模塊、系統API的命名空間相沖突即可。
1.
有意識的爲變量名、宏名加上本模塊的關鍵字,就不至於和其它模塊、系統API的命名空間相沖突;例如: 宏的名稱過短,如:DEBUG; _DEBUG,很可能和別的模塊,系統模塊相沖突;
2.
局部變量尤其是循環變量外,使用約定俗成的 i,j,k ,沒有問題;
3.
宏、常量、枚舉enum,全部用大寫字母;
4.
全局變量加上前綴 "g",後面跟上首字母大寫的單詞;
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
類或結構
CDocumentCPrintInfo
m_
成員變量
m_pDocm_nCustomers

變量命名規範

前綴
類型
描述
實例
ch
char
8位字符
chGrade
ch
TCHAR
如果_UNICODE定義,則爲16位字符
chName
b
BOOL
布爾值
bEnable
n
int
整型(其大小依賴於操作系統)
nLength
n
UINT
無符號值(其大小依賴於操作系統)
nHeight
w
WORD
16位無符號值
wPos
l
LONG
32位有符號整型
lOffset
dw
DWORD
32位無符號整型
dwRange
p
*
指針
pDoc
lp
FAR*
遠指針
lpszName
lpsz
LPSTR
32位字符串指針
lpszName
lpsz
LPCSTR
32位常量字符串指針
lpszName
lpsz
LPCTSTR
如果_UNICODE定義,則爲32位常量字符串指針
lpszName
h
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

Microsoft MFC宏命名規範

名稱
類型
_AFXDLL
唯一的動態連接庫(Dynamic Link LibraryDLL)版本
_ALPHA
僅編譯DEC Alpha處理器
_DEBUG
包括診斷的調試版本
_MBCS
編譯多字節字符集
_UNICODE
在一個應用程序中打開Unicode
AFXAPI
MFC提供的函數
CALLBACK
通過指針回調的函數

庫標識符命名法

標識符
值和含義
u
ANSIN)或UnicodeU
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 NTWindows 9x32位);它是unsigned int的同義詞
LRESULT
窗口程序返回值的類型
LPARAM
聲明lParam所使用的類型,lParam是窗口程序的第四個參數
WPARAM
聲明wParam所使用的類型,wParam是窗口程序的第三個參數
LPVOID
一般指針類型,與(void *)相同,可以用來代替LPSTR

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