軟件開(kāi)發(fā):實(shí)體抽象為虛擬體,復(fù)雜龐大的邏輯區(qū)分依賴(lài)規(guī)則的建立。運(yùn)用命名規(guī)則來(lái)搭建框架,會(huì)使整個(gè)軟件系統(tǒng)框架,有更清晰的可讀性和可維護(hù)性。

一、命令的整體原則

在編寫(xiě)一個(gè)子模塊或者派生類(lèi)的時(shí)候,需要遵循其基類(lèi)或整體模塊的命令風(fēng)格,保持命令風(fēng)格在整體模塊的同一性。

標(biāo)識(shí)符采用英文單詞或其組合,應(yīng)當(dāng)直觀且可以拼讀,可望文知意,用詞應(yīng)當(dāng)準(zhǔn)確。

在保持一個(gè)標(biāo)識(shí)符明確意思的同時(shí),應(yīng)該盡量縮短其長(zhǎng)度。

不要出現(xiàn)緊靠大小寫(xiě)區(qū)分的標(biāo)識(shí)符,例如“i”與“I”,“function”與“Function”等。

程序中不要出現(xiàn)名字完全相同的局部變量和全局變量,盡管兩者的作用域不同而不會(huì)發(fā)生語(yǔ)法的錯(cuò)誤,但是容易使人誤解。

用正確的反義詞命名具有互斥意義的標(biāo)識(shí)符,如:“nMinValue"和"nMaxValue”,"GetName()“和"SetName()”

盡量避免名字出現(xiàn)數(shù)字的編號(hào),如Value0、Value1、Value2等,除非邏輯上的確需要編號(hào)。這是為了防止程序員偷懶,不肯為命名動(dòng)腦筋從而導(dǎo)致了產(chǎn)生無(wú)意義的名字(因?yàn)橛脭?shù)字編號(hào)最省事)。

二、類(lèi)/結(jié)構(gòu)的命名

除了異常類(lèi)等個(gè)別情況(不希望用戶(hù)把類(lèi)看作一個(gè)普通的、正常類(lèi)的情況)外,C++類(lèi)結(jié)構(gòu)的命名一般應(yīng)該遵循以下準(zhǔn)則

類(lèi)的名字都要以大寫(xiě)的字母“C”開(kāi)頭,后跟一個(gè)或多個(gè)單詞。為便于界定,每個(gè)單詞的首字母需要大寫(xiě)。

類(lèi)的命名推薦用“名詞”或者“形容詞+名詞”的形式,例如:“CAnalyzer”、“CFVecteor” …

三、C語(yǔ)言結(jié)構(gòu)體的命名

傳統(tǒng)C結(jié)構(gòu)體的名稱(chēng)全部由大寫(xiě)字母組成,單詞間使用下劃線界定,例如:“SERVICE_STATUS”,“DRIVER_INFO”…

四、函數(shù)命名

函數(shù)的名稱(chēng)由一個(gè)或者多個(gè)單詞組成。便于界定,每個(gè)單詞的首字母要大寫(xiě)。

推薦的組織形式 函數(shù)名應(yīng)該使用“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)賓詞組)形式。例如:“GetName()”、“SetName()”、“Erase()”、“Reserve()”…

保護(hù)成員函數(shù)的開(kāi)頭應(yīng)當(dāng)加上一個(gè)下劃線“_“以示區(qū)分,例如”_SetState()”…

類(lèi)似地,私有成員函數(shù)的開(kāi)頭應(yīng)當(dāng)加上兩個(gè)下劃線“__”,例如“__DestroyImp()”…

虛函數(shù) 虛函數(shù)習(xí)慣用"Do"開(kāi)頭,如:“DoRefresh()”,"_DoEncryption()"…

回調(diào)和事件處理函數(shù)習(xí)慣以單詞"On"開(kāi)頭。例如:"_OnTimer()",“OnExit()”

五、變量命名

變量應(yīng)該是程序中使用最多的標(biāo)識(shí)符了,變量的命名規(guī)范可能是一套C++命名準(zhǔn)則中最重要的部分。

變量名由作用于前綴+類(lèi)型的綴+一個(gè)或多個(gè)單詞組成。為了便于界定,每個(gè)單詞的首字母要大寫(xiě)。對(duì)于某些用途簡(jiǎn)單明了的局部變量,也可以使用簡(jiǎn)化的方式,如:i,j,k,x,y,z...

作用域前綴標(biāo)明了一個(gè)變量的可見(jiàn)范圍。作用域可以有以下幾種:

前綴 說(shuō)明

無(wú) 局部變量

m_ 類(lèi)的成員變量(member)

sm_ 類(lèi)的靜態(tài)成員變量(static member)

s_ 靜態(tài)變量(static)

g_ 外部全局變量(global)

sg_ 靜態(tài)全局變量(static global)

sg_ 靜態(tài)全局變量(static global)

gg_ 進(jìn)程間共享的數(shù)據(jù)段全局變量(global global)

除非不得已,否則應(yīng)該盡可能少用全局變量。

前綴 說(shuō)明

n 整型和位域變量(number)

e 枚舉型變量(enumeration)

c 字符型變量(char)

b 布爾型變量(bool)

f 浮點(diǎn)型變量(float)

p 指針型變量和迭代子(pointer)

pfn 特別針對(duì)指向函數(shù)指針變量和函數(shù)指針(pointer of function)

g 數(shù)組(grid)

i 類(lèi)的實(shí)例(instance)對(duì)于經(jīng)常用到的類(lèi),也可以定義一些專(zhuān)門(mén)的前綴,如:std::string和std::wstring類(lèi)的前綴可以定義為"st",std::vector類(lèi)的前綴可以定義為"v"等等

類(lèi)型的綴可以組合使用,例如"gc"表示字符數(shù)組,"ppn"表示指向整型的指針的指針等等。

4.推薦的組成形式

變量的名字應(yīng)當(dāng)使用"名詞"或者"形容詞+名詞"。例如:"nCode","m_nState","nMaxWidth"...

六、常量命名

C++引入了對(duì)常量的支持,常量的命名規(guī)則如下:

常量名由類(lèi)型前綴+全大寫(xiě)字母組成,單詞間通過(guò)下劃線來(lái)界定,如cDELIMITER,nMAX_BUFFER…類(lèi)型前綴的定義和變量命名規(guī)則中的相同。

七、枚舉、聯(lián)合、typedef

枚舉、聯(lián)合以及typdef的命名 枚舉、聯(lián)合以及typedef語(yǔ)句生成的類(lèi)型名全都是大寫(xiě)字母組成,單詞間通過(guò)下劃線界定,如:FAR_PROC,ERROR_TYPE…

八、宏、枚舉值

宏、枚舉值的命名 宏和枚舉值全大寫(xiě)字母組成,單詞通過(guò)下劃線界定,如:ERROR_UNKNOWN,OP_STOP…

九、函數(shù)的名字修飾

函數(shù)的名字修飾(Decorated Name)就是編譯器在編譯期間創(chuàng)建的一個(gè)字符串。用來(lái)指明函數(shù)的定義或原型。LINK程序或其它工具有時(shí)須要指定函數(shù)的名字修飾來(lái)定位函數(shù)的正確位置。

還有一種須要指定函數(shù)的 名字修飾的情況是在匯編程序中調(diào)用C或C++的函數(shù)。

十、C編譯器的函數(shù)名修飾規(guī)則

對(duì)于__stdcall調(diào)用約定,編譯器和鏈接器會(huì)在輸出函數(shù)名前加上一個(gè)下劃線前綴,函數(shù)名后面加上一個(gè)“@”符號(hào)和其參數(shù)的字節(jié)數(shù)。比如 _functionname@number。__cdecl調(diào)用約定僅在輸出函數(shù)名前加上一個(gè)下劃線前綴。比如_functionname。 __fastcall調(diào)用約定在輸出函數(shù)名前加上一個(gè)“@”符號(hào)。后面也是一個(gè)“@”符號(hào)和其參數(shù)的字節(jié)數(shù),比如 @functionname@numbe

十一、C++編譯器的函數(shù)名修飾規(guī)則

C++的函數(shù)名修飾規(guī)則有些復(fù)雜??墒切畔⒏浞?,通過(guò)分析修飾名不僅可以知道函數(shù)的調(diào)用方式。返回值類(lèi)型,參數(shù)個(gè)數(shù)甚至參數(shù)類(lèi)型。無(wú)論 __cdecl,__fastcall還是__stdcall調(diào)用方式,函數(shù)修飾都是以一個(gè)“?”開(kāi)始,后面緊跟函數(shù)的名字。再后面是參數(shù)表的開(kāi)始標(biāo)識(shí)和 依照參數(shù)類(lèi)型代號(hào)拼出的參數(shù)表。

對(duì)于__stdcall方式,參數(shù)表的開(kāi)始標(biāo)識(shí)是“@@YG”,對(duì)于__cdecl方式則是“@@YA”。對(duì)于 __fastcall方式則是“@@YI”。參數(shù)表的拼寫(xiě)代號(hào)例如以下所看到的:

X--void

D--char

E--unsigned char

F--short

H--int

I--unsigned int

J--long

K--unsigned long(DWORD)

M--float

N--double

_N--bool

U--struct

....

指針的方式有些特別。用PA表示指針,用PB表示const類(lèi)型的指針。

后面的代號(hào)表明指針類(lèi)型。假設(shè)同樣類(lèi)型的指針連續(xù)出現(xiàn),以“0”取代,一 個(gè)“0”代表一次反復(fù)。U表示結(jié)構(gòu)類(lèi)型。通常后跟結(jié)構(gòu)體的類(lèi)型名,用“@@”表示結(jié)構(gòu)類(lèi)型名的結(jié)束。函數(shù)的返回值不作特殊處理,它的描寫(xiě)敘述方式和函數(shù)參數(shù)一 樣。緊跟著參數(shù)表的開(kāi)始標(biāo)志,也就是說(shuō)。函數(shù)參數(shù)表的第一項(xiàng)實(shí)際上是表示函數(shù)的返回值類(lèi)型。參數(shù)表后以“@Z”標(biāo)識(shí)整個(gè)名字的結(jié)束。假設(shè)該函數(shù)無(wú)參數(shù),則 以“Z”標(biāo)識(shí)結(jié)束。

注:

1.__stdcall :以“?”標(biāo)識(shí)函數(shù)名的開(kāi)始。后跟函數(shù)名。 函數(shù)名后面以“@@YG”標(biāo)識(shí)參數(shù)表的開(kāi)始,后跟參數(shù)表。2 __cdecl調(diào)用約定: 規(guī)則同上面的 _stdcall 調(diào)用約定,僅僅是參數(shù)表的開(kāi)始標(biāo)識(shí)由上面的“@@YG”變?yōu)椤癅@YA”3 __fastcall調(diào)用約定: 規(guī)則同上面的_stdcall調(diào)用約定,僅僅是參數(shù)表的開(kāi)始標(biāo)識(shí)由上面的“@@YG”變?yōu)椤癅@YI”。VC++對(duì)函數(shù)的省缺聲明是"__cedcl",將僅僅能被C/C++調(diào)用。十二、查看函數(shù)的名字修飾

有兩種方式能夠檢查你的程序中的函數(shù)的名字修飾:使用編譯輸出列表或使用Dumpbin工具。使用/FAc,/FAs或/FAcs命令行參數(shù)能夠讓編譯器 輸出函數(shù)或變量名字列表。使用dumpbin.exe /SYMBOLS命令也能夠獲得obj文件或lib文件里的函數(shù)或變量名字列表。

此外。還能夠使用 undname.exe 將修飾名轉(zhuǎn)換為未修飾形式

本文參考CSDN博主「卡圖盧斯」的文章和yxysuanfa的文章,其鏈接為:https://blog.csdn.net/u014647208/article/details/84103204和https://www.cnblogs.com/yxysuanfa/p/6984895.html

1.《命名規(guī)則 C++命名規(guī)則詳解》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。

2.《命名規(guī)則 C++命名規(guī)則詳解》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/keji/347285.html