C++之匈牙利命名法

2020-08-10 10:34:49

C++之匈牙利命名法

匈牙利命名法(Hungarian notation)是電腦程式設計中的一種變數命名規則,此命名法又可細分爲:
    系統匈牙利命名法
    匈牙利應用命名法
  
  匈牙利命名法具備語言獨立的特性,並且首次在BCPL語言中被大量使用。由於BCPL只有機器字這一種數據型別,因此這種語言本身無法幫助程式設計師來記住變數的型別。匈牙利命名法通過明確每個變數的數據型別來解決這個問題。
  在匈牙利命名法中,一個變數名由一個或多個小寫字母開始,這些字母有助於記憶變數的型別和用途,緊跟着的就是程式設計師選擇的任何名稱。這個後半部分的首字母可以大寫,以區別前面的型別指示字母(參見駝峯式大小寫)。

歷史

原始的匈牙利命名法,現在被稱爲匈牙利應用命名法,由1972年至1981年在施樂帕洛阿爾托研究中心工作的-程式設計師查爾斯·西蒙尼發明。此人後來成了微軟的總設計師。
  這種命名法其實是對於西蒙尼祖籍的一種諷刺。匈牙利人名和大多數其他歐洲人名相比是反過來的,即姓氏在名字的前面。舉個例子,英語化的名字「Charles Simonyi」在匈牙利語中原本是「Simonyi Károly」。同樣的,在匈牙利命名法中,型別名在實際變數名前,而不是像大多數歐洲的Smalltalk那樣,型別放在變數名後,例如aPoint和lastPoint。後者在西蒙尼任職於施樂帕洛阿爾托研究中心時期非常流行。這種命名法的靈感,可能是受波蘭表示法的啓發。
  匈牙利命名法的英文是Hungarian notation,這個詞能讓許多人記住,因爲難發音的輔音字串有點像部分東歐語言中,輔音豐富的拼寫方式,儘管實際上匈牙利語是屬於芬蘭-烏戈爾語族,而不像斯拉夫語族那樣元音豐富。舉例來說,零結束字串的字首"sz"實際上就是匈牙利字母表中的一個合體字母(參看德語中的ß)。

範例

bBusy:布爾型
cApples:專案計數
dwLightYears:雙字(系統)
fBusy:布爾型或浮點型
nSize:整型(系統)或計數(應用)
iSize:整型(系統)或索引(應用)
fpPrice:浮點數
dbPi:雙精度浮點數(系統)
pFoo:指針
rgStudents:陣列或範圍
szLastName:零結束字串
u32Identifier:無符號32位整型(系統)
stTime:時鐘結構
fnFunction:函數名
對於指針和陣列來說,它們實際上並不是數據型別,因此通常在助記符後面跟着實際元素的型別。

pszOwner:指向零結束字串的指針
rgfpBalances:浮點值的陣列
儘管匈牙利命名法可以被應用在任何程式設計語言和環境中,由於微軟在C語言專案中,
特別是在Microsoft Windows裡的大量應用,使得匈牙利命名法的應用大量存在於和Windows相關的領域:

hwndFoo:視窗控制代碼
lpszBar:指向零結束字串的長指針
這種命名法又是在C++中被擴充套件而包含變數的作用域,由一個下劃線隔開:

g_nWheels:全域性命名空間的成員,整型
m_nWheels:結構體/類成員,整型