匈牙利命名法 介绍 淘汰分析及取舍
1、是什么
匈牙利命名:開頭字母用變量類型的縮寫,其余部分用變量的英文單詞或縮寫,要求英文單詞首字母大寫。例如:
int iMyAge; // “i”是int類型的縮寫; char cMyName[10]; // “c”是char類型的縮寫; float fManHeight; // “f”是float類型的縮寫;2、為什么淘汰
優點:
能夠通過變量的名字來識別變量的類型,而不必去查找它的定義.
缺點:
(1)使變量名字非常繞口,例如:lpszFoo表示"Foo"是一個指向以空字符為結尾的字符串的長整型指針.
(2)使改變變量類型的工作變得復雜。
例如:在Windows3.1中,整型變量為16為寬.如果我們在開始時采用了一個整型變量,但是在通過30---40個函數的計算之后,發現采用整型變量寬度不夠,這時我們不僅要改變這個變量的類型,而且要改變這個變量在這30--40個函數中的名字.
由此可見,使用類型前綴是一種糟糕的想法,因為它把變量和其類型緊緊地綁在了一起.
(3)現在許多IDE帶有自動提示功能,直接提示變量類型,所以匈牙利命名法冗余了。
(4)最重要的是,不同語言中有大量特有的數據類型,還有大量自定義的數據類型,不同的人很容易混淆不同類型前綴,導致類型前綴無法達到識別類型的目的。
3、如何取舍
(1)控件的命名依舊采用Hungarian Notation,控件上的Hungarian Notation要靠譜的多,例如:
Button -> btn Label -> lbl TextBox -> txt …(2)變量命名上,僅保留以下前綴
global -> g_ member -> m_ static -> s_ pointer -> p char*/wchar_t* -> psz char[]/wchar_t[] ->szm_能夠與非成員變量區分,而且基本可以避免變量重名而需要使用this指針的情況
g_和s_的意圖無需多說,臭名昭著的global和static從來都需要特別對待
有人可能會對剩下的三個前綴頗有微詞,我的理由是,這三個類型(其實只有兩個)實在太特殊而且需要引起足夠的注意,加前綴的意圖則是告訴你:be careful! be careful!be careful!
其他的類型都盡量不加前綴。
4、匈牙利命名法前綴列舉
(1)通用類型
| 前綴 | 類型 | 中文說明 |
| a | Array | 數組 |
| b | BOOL(int) | 布爾(整數) |
| by | Unsigned Char(Byte) | 無符號字符(字節) |
| c | Char | 字符(字節) |
| ch | char | 8位字符 |
| ch | TCHAR | 如果_UNICODE定義,則為16位字符 |
| cb | Count of Bytes | 字節數 |
| cr | Color Reference Value | 顏色(參考)值 |
| cx | Count of x(Short) | 坐標x 的集合(短整數) |
| dw | DWORD | 32位無符號整型 |
| 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 Integer | 短整數 |
| p | Pointer * | 指針 |
| lp | FAR* | 遠指針 |
| lpfn | callback | 指向CALLBACK函數的遠指針 |
| lpsz | LPSTR | 32位字符串指針 |
| lpsz | LPCSTR | 32位常量字符串指針 |
| lpsz | LPCTSTR | 如果_UNICODE定義,則為32位常量字符串指針 |
| s | String | 字符串 |
| sz | Zero Terminated String | 以零結尾的字符串 |
| tm | Text Metric | 文本規則 |
| u | Unsigned Integer | 無符號整數 |
| ul | Unsigned Long(ULONG) | 無符號長整數 |
| w | WORD(Unsigned Short) | 無符號短整數 |
| x,y | x, y Coordinates (Short) | 坐標值(短整數) |
| v | Void | 空 |
(2)使用范圍
有關項目的全局變量用g_開始,類成員變量用m_,局部變量若函數較大則可考慮用l_用以顯示說明其是局部變量。
| 前綴 | 類型 | 例子 |
| g_ | 全局變量 | g_Servers |
| C | 類或者結構體 | CDocument, CPrintInfo |
| m_ | 成員變量 | m_pDoc, m_nCustomers |
(3)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 |
(4)Windows、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 |
(5)前綴含義
| 前綴 | 符號類型 | 實例 | 范圍 |
| 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 |
(6)Microsoft MFC宏命名規范:
| 名稱 | 類型 |
| _AFXDLL | 唯一的動態連接庫(Dynamic Link Library,DLL)版本 |
| _ALPHA | 僅編譯DEC Alpha處理器 |
| _DEBUG | 包括診斷的調試版本 |
| _MBCS | 編譯多字節字符集 |
| _UNICODE | 在一個應用程序中打開Unicode |
| AFXAPI | MFC提供的函數 |
| CALLBACK | 通過指針回調的函數 |
(7)庫標識符命名法:
| 標識符 | 值和含義 |
| u | ANSI(N)或Unicode(U) |
| d | 調試或發行:D = 調試,忽略標識符為發行。 |
(8)靜態庫版本命名規范:
| 庫 | 描述 |
| NAFXCWD.LIB | 調試版本:MFC靜態連接庫 |
| NAFXCW.LIB | 發行版本:MFC靜態連接庫 |
| UAFXCWD.LIB | 調試版本:具有Unicode支持的MFC靜態連接庫 |
| UAFXCW.LIB | 發行版本:具有Unicode支持的MFC靜態連接庫 |
(9)動態連接庫命名規范:
| 名稱 | 類型 |
| _AFXDLL | 唯一的動態連接庫(DLL)版本 |
| WINAPI | Windows所提供的函數 |
(10)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 |
參考文檔:
https://www.cnblogs.com/totem1990/archive/2012/03/26/2418474.html
https://blog.csdn.net/yangluoning/article/details/11628047
總結
以上是生活随笔為你收集整理的匈牙利命名法 介绍 淘汰分析及取舍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪些网站可以发外链?分享几十个个可以发外
- 下一篇: PartitionMagic合并分区后无