常用的命名法有匈牙利命名法、驼峰式命名法和Pascal命名法。

驼峰式命名法和Pascal命名法有些相似,单字之间不用任何连接符号隔开( - 和 _ 等)连结,有两种格式:
小驼峰式命名法(lower camel case):
第一个单字以小写字母开始;第二个单字的首字母大写,例如:firstName、lastName。

大驼峰式命名法(upper camel case):
每一个单字的首字母都采用大写字母,例如:FirstName、LastName、CamelCase,也被称为Pascal命名法。

本文重点说说匈牙利命名法,这种命名方法很适合在C++程序中使用。下面分变量和函数名来分别说明。

变量,基本结构:[ prefix(es)]  base  [ Qualifier(s) ]

其中base比较重要,最好不要省略,而prefix和qualifier则可以看情况省略。base部分描述的是变量的语义类型。举例来说ch表示字符,而不表示一个字节或者2个字节,而且它既可以表示ASCII字符也可以表示UNICODE字符,只要它是个字符就行,而不关心其存储是什么样的。命名法是为了提高可读性,但不是要只看变量的名字就能知道存储空间、layout等所有细节。下面的内容拷贝自http://www.csie.nctu.edu.tw/~skyang/simonyi.zhtw.htm, 更早的原文已经打不开了,请原作者见谅。

 1.1     構造匈牙利名稱

一個通常的匈牙利名稱由一個或者多個前綴字prefix)、一個基本標識base tag)和一個修飾符qualifier)拼接而成。基本標識指示了變數的類型(如"co"代表color), 前綴字修正該類型(如"rg"表示陣列,那麼"rgco"就表示顏色陣列),修飾符描述了該特定類型的應用(如"rgcoGray"表示用作灰度的顏色陣列)。並非所有名字都會使用全部組成元素, 前綴字往往是不需要的,而當類型的應用是顯而易見的時候,比如當代碼中只包含一個相關類型時,修飾符也可以省略。

值得提醒的是:許多(也許絕大部分)基本標識和修飾符將是應用程式相關的,因為它們被用於表示應用程式定義的類型和應用。雖然我們已經為一些基本類型定義了標準標識(下面將列出其中一部分),但是在更適於使用抽象類型的場合下使用這些標準標識是錯誤的。例如,如果一個color恰好是用long來實現的,那麼有人可能會用"rgl"來標識一個顏色陣列,但是這樣將破壞對color的抽象。

當匈牙利命名法用於函數名稱時,修飾符通常僅僅標識了函數的動作。有時在基本識別字後添加描述函數參數的匈牙利類型會很有用。當然,函數名的首字母一定要大寫。例如"FInitFooFromHwndXY"應當是一個函數的名字,該函數將使用類型為HwndXY的參數來初始化一個"foo"結構,並且返回一個Boolean成功代碼。這種做法並非強制性的,只有當這樣做會讓函數名更易於理解才這樣做。

1.2     標準基本標識

下面的表中給出了基本類型的標準基本標識。如上所述,應用程式將為其內部類型定義許多自己的標識。

f

標誌(BOOL)。取值為TRUE或者FALSE。修飾符應當描述何時該標誌為TRUE,例如fError表示當錯誤發生時變數為TRUE

fl

單精準度浮點數(float)。

ch

單字節字元(CHAR)

sz

0結尾的CHAR型字串(經典的C字串)。有時可以描述字串的最大長度,如"sz255"表示實際的字串體可以容納255個字元,因此必需分配256個字元。

st

帶長度前綴字的CHAR型字串。這種字串長度不超過255個字元,因為其長度必須存放在一個位元組中。如同sz一樣,可以用"st32"來表示字串最大長度為32,因此需要分配33個字元空間來存放字元及其長度。

stz

帶長度前綴字同時也以0結尾的CHAR型字串。注意如果在名稱中描述了長度length,那麼至少要分配length+2CHAR

chw, wt, wz, wtz

chszststz的寬字元(WCHAR)版本。所有最終用戶可見的字串都必須使用寬字串(UNICODE)

fn

函數。通常和"p"前綴字(見下)連用成為"pfn",因為在C中只能將函數位址存放在變數中。

b

一個BYTE。

w

一個16位元的無符號數量值(WORD, SHORT, or USHORT)

dw

一個32位元的無符號雙字(DWORD)

l

一個LONG (有符號32位數量值).

u

一個無符號長整型數(ULONG)。在經典的匈牙利命名法中,這代表一個無符號word,在Office中,這代表一個無符號32位數量值,與"dw"相同,但是當類型是數值時更傾向用"u"標識(和ULONG類型)。

v

Void類型。總是和"p"連用構成"pv",標識指向未知類型的指標。

sc

OLE SCODE

hr

OLE HRESULT

var

OLE VARIANT

varg

OLE VARIANTARG

1.3     標準前綴字

下面表中給出了用於修飾基本標識類型的標準前綴字。可以使用一個或者多個前綴字。應用程式有可能(但是可能很罕見)需要定義自己的 前綴字(典型情況是一個應用程式將只定義基本標識和修飾符)。

p

指針。例如"pch"標識指向一個字元的指標,在經典的微軟匈牙利命名法中,"p"代表near pointer,相應地,"lp""hp"用於表示long (far) pointerhuge pointer。在32位世界裏,這不再是個問題了。

rg

陣列("range"變來)。例如"rgch"表示字元陣列。同C/C++用法一樣,這可以是一個分配好的陣列的名字,也可以是指向陣列的指標的名字。

i

基本類型陣列的索引。例如"ich"表示字元陣列的索引。

c

基本類型項目的總數。例如"cch"表示字元總數。

n

另一種表示某基本類型專案的總數的前綴字(表示"number of"),但是最好用"c"

d

某基本類型值的差值,例如"dx"表示兩個類型為x的值的差。

h

控制碼。一個到不能被用戶間接訪問的某基本類型項目的非透明引用(過去使用此定義是因為對可移動記憶體塊有不同用法)。例如"hwnd"是到窗口("wnd")的控制碼,因為控制碼不在你的位址空間中,所以不允許你間接訪問視窗結構中的域(這樣還保持了非透明引用的抽象性)。一個應用程式模組應當引出指向抽象資料類型的控制碼(典型地應當定義為void *),這樣客戶就只能使用此引用而絕對不能看到其中的資料欄。然而在C++中,由於可以通過私有資料成員來引出指向類物件的指標,因此這樣做已經不那麼必要了。

pl

一 “ 從 ”對象(A “plex” of objects)。這是簡單陣列(”rg”)之外的另一種選擇,表示了使用plex抽象以標準方式可變的陣列(參見inc\msoalloc.h)。

mp

用於將索引或者其他標量映射到值的陣列。此前綴字後面要加上索引和值的標識,如"mpchdx"表示將字元值(作為陣列索引)映射到該字元對應的dx值上的陣列。

V

總體變數,總是第一個前綴字。

 

除此之外,我們還可以在合適的時候添加下面的一些前綴字到任何匈牙利命名前綴字之前:

m_

C++類的資料成員。

s_

C++類的靜態資料成員。

Mso

引出的全局函數。

MSO

引出的自定義類型。

mso

引出的全局常量或者總體變數。

1.4     標準修飾符

大部分修飾符都按照該名字被使用的場合來定義,但是還是有一些預定義的標準修飾符如下:

First

集合中的第一個元素或者第一個感興趣的元素(如pchFirst)。

Last

集合中的最後一個原始或者最後一個感興趣的元素(如pchLast)。當用作索引時,Last表示最後一個合法的/期望的值,因此迴圈可以如下定義: for (ich = ichFirst; ich <= ichLast; ich++)

Lim

集合中元素的上限。與Last不同,Lim不表示合法值,Lim是最後一個合法值加1,因此迴圈可以如下定義: for (ich = ichFirst; ich < ichLim; ich++)

Min

集合中的最小元素,類似於First,但是通常表示第一個合法值,而不僅僅是第一個要處理的值。

Max

集合中元素的上限(和Lim一樣)。不幸的是,"Max"的正常英語讀法通常暗示了最後一個合法值,但是Max修飾符不表示合法值,而是合法值加1。和Lim一樣,Max的典型用法如下:

for (ich = ichMin; ich < ichMax; ich++) 對Max的使用一定要非常小心。

Mac

類似於Max,但是有時用於 “ 當前 ” 最大值會隨著時間而改變的情況下。注意Mac也是最後一個合法值加1

Mic

類似於Min,但有時用於“ 當前 ” 最小值會隨著時間而改變的情況下。

T

臨時值。此修飾符可能被作為避免創建新的好名字的一種方法而被濫用,但是有時將其用於聲明簡單的臨時值是適合的,如在經典的swap操作中那樣。

TT, T3,等等

在需要更多唯一名字的時候對 T = temporary 約定的進一步濫用。應當完全避免。

Sav

用於保存值的臨時值,以便將來恢復。例如: hwndSav = hwnd; ...; hwnd = hwndSav;

Null

特定的0值。雖然總是等於0,但是可用于文檔化的目的(如hwndNull)。

Nil

特定的非法值,不必要等於0(可能是-1或者任何其他值)。為了避免混淆,最好不要為同一類型同時定義NullNil值。

Src

操作源,典型地用法是和Dest配套使用,如:

*pchDest = *pchSrc

Dest

操作目的,參見Src。