C&C++設(shè)計(jì)風(fēng)格選擇 命名規(guī)范
1.命名規(guī)范
1.1.常見(jiàn)命名法
然而,當(dāng)面對(duì)復(fù)雜情況時(shí)就有些棘手,給全局變量取一個(gè)描述性的名字是必要的。把一個(gè)全局函數(shù)叫做“foo”是一種目光短淺的行為。全局函數(shù)也一樣,如果你有一個(gè)統(tǒng)計(jì)當(dāng)前用戶個(gè)數(shù)的函數(shù),應(yīng)當(dāng)把它命名為“count_active_user()”或者簡(jiǎn)單點(diǎn)些的類(lèi)似名稱,不應(yīng)該命名為“cntusr()”。
printEmployeePaychecks();
print_employee_paychecks();
匈牙利命名法關(guān)鍵是:標(biāo)識(shí)符的名字以一個(gè)或者多個(gè)小寫(xiě)字母開(kāi)頭作為前綴;前綴之后的是首字母大寫(xiě)的一個(gè)單詞或多個(gè)單詞組合,該單詞要指明變量的用途。
DisplayInfo();
string UserName;
add / remove begin / end create / destroy
insert / delete first / last g et / release
increment / decrement put / get
add / delete lock / unlock open / close
min / max old / new start / stop
next / previous source / target show / hide
send / receive source / destination
cut / paste up / down
int min_sum;
int max_sum;
int add_user( BYTE *user_name );
int delete_user( BYTE *user_name );
即開(kāi)頭字母用變量的類(lèi)型,其余部分用變量的英文意思、英文的縮寫(xiě)、中文全拼或中文全拼的縮寫(xiě),要求單詞的第一個(gè)字母應(yīng)大寫(xiě)。
即: 變量名=變量類(lèi)型+變量的英文意思(或英文縮寫(xiě)、中文全拼、中文全拼縮寫(xiě))
對(duì)非通用的變量,在定義時(shí)加入注釋說(shuō)明,變量定義盡量可能放在函數(shù)的開(kāi)始處。
見(jiàn)下表:
bool 用b開(kāi)頭 bFlg
int 用i開(kāi)頭 iCount
short int 用n開(kāi)頭 nStepCount
long int 用l開(kāi)頭 lSum
char 用c開(kāi)頭 cCount
unsigned char 用by開(kāi)頭
float 用f開(kāi)頭 fAvg
double 用d開(kāi)頭 dDeta
unsigned int(WORD) 用w開(kāi)頭 wCount
unsigned long int(DWORD) 用dw開(kāi)頭 dwBroad
字符串 用s開(kāi)頭 sFileName
用0結(jié)尾的字符串 用sz開(kāi)頭 szFileName
對(duì)一重指針變量的基本原則為:“p”+變量類(lèi)型前綴+命名,如一個(gè)float*型應(yīng)該表示為pfStat。對(duì)二重指針變量的基本規(guī)則為:“pp”+變量類(lèi)型前綴+命名。對(duì)三重指針變量的基本規(guī)則為:“ppp”+變量類(lèi)型前綴+命名。
enum cmEMDAYS
{
EMDAYS_MONDAY;
EMDAYS_TUESDAY;
……
};
struct ScmNPoint
{
int nX;//點(diǎn)的X位置
int nY; //點(diǎn)的Y位置
};
union UcmLPoint
{
LONG lX;
LONG lY;
}
如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示類(lèi)別。
LONG GetDeviceCount(……);
void print_record( unsigned int rec_ind ) ;
int input_record( void ) ;
unsigned char get_current_color( void ) ;
應(yīng)確保每個(gè)函數(shù)聲明中的參數(shù)的名稱、類(lèi)型和定義中的名稱、類(lèi)型一致。
(2)為了提高程序的運(yùn)行效率,減少參數(shù)占用的堆棧,傳遞大結(jié)構(gòu)的參數(shù),一律采用指針或引用方式傳遞。
(3)為了便于其他程序員識(shí)別某個(gè)指針參數(shù)是入口參數(shù)還是出口參數(shù),同時(shí)便于編譯器檢查錯(cuò)誤,應(yīng)該在入口參數(shù)前加入const標(biāo)志。
如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)
1.2.文件命名
# C語(yǔ)言不糾結(jié) file.h & file.c # C++ Group.1(注意C是大寫(xiě)) file.h & file.C # C++ Group.2 file.hh & file.cc # C++ Group.3 file.hpp & file.cpp # C++ Group.4 file.hxx & file.cxx
tip.2:各組合可以混搭,比如常見(jiàn)的file.cpp搭配file.h和Google風(fēng)格的file.cc搭配file.h;
tip.3:強(qiáng)迫癥可以選擇不混搭的各組,這樣看起來(lái)有對(duì)稱感;
tip.4:不要選擇第1組大寫(xiě)C的后綴,特別是在Windows這樣不區(qū)分大小寫(xiě)的操作系統(tǒng)上;
tip.5:一些后綴名可能不被某些較老的編譯器或IDE所默認(rèn)支持,例如vs2005默認(rèn)沒(méi)有擴(kuò)展.hh后綴;
tip.6:如果需要跨平臺(tái),推薦選擇第3組,至少boost是這么選的;
# Teddy項(xiàng)目UserLog文件為例: # Group.1 UserLog.c & TedUserLog.c # Group.2 userlog.c & teduserlog.c # Group.3 userlog.c & ted_userlog.c # Group.4 user_log.c & ted_user_log.c # Group.5 user-log.c & ted-user-log.c
tip.2:各組文件名風(fēng)格都沒(méi)有明顯的缺點(diǎn),但要注意在區(qū)分大小寫(xiě)的系統(tǒng)上UserLog.c和userlog.c是兩個(gè)文件;
1.3.類(lèi)型命名
/* ** 基本數(shù)據(jù)類(lèi)型的重定義,小寫(xiě)比首字母大寫(xiě)更有利于延長(zhǎng)Shift壽命, ** 但也更容易產(chǎn)生命名沖突。 */ typedef unsigned char byte; typedef unsigned char byte_t; typedef unsigned char Byte; typedef unsigned char Byte_t; /* ** 類(lèi)與結(jié)構(gòu)體常見(jiàn)的風(fēng)格是采用PascalCase,不推薦使用camelCase ** 這種怪異的風(fēng)格。 */ class HashTable { ... class hash_table { ... struct FileInfo { ... struct file_info { ... /* C語(yǔ)言常見(jiàn)到的風(fēng)格還有結(jié)構(gòu)體名稱加'_t'后綴 */ struct fileinfo_t { ... struct FileInfo_t { ... /* 枚舉命名常見(jiàn)PascalCase風(fēng)格 */ enum FileFlags { ... enum file_flags { ...
tip.1:c語(yǔ)言沒(méi)有命名空間,為防止命名沖突,常見(jiàn)做法是將項(xiàng)目名或其縮寫(xiě)作為類(lèi)型名稱前綴;
tip.2:類(lèi),結(jié)構(gòu)體,枚舉的命名風(fēng)格盡量保持一致;
1.4.命名空間命名
/* 一般使用項(xiàng)目名稱,風(fēng)格看喜好。 */ namespace my_project { ... namespace MyProject { ...
tip.1:確保命名空間不會(huì)和常用的庫(kù)沖突;
1.5.函數(shù)和變量命名
/* ** 在函數(shù)和變量命名風(fēng)格上PascalCase,camelCase, ** snake_case三足鼎立,選擇憑喜好。 */ void FunctionName(void) { ... void functionName(void) { ... void function_name(void) { ... long VarName; long varName; long var_name; /* ** tip.1:snake_case在名稱比較長(zhǎng)時(shí)可讀性較好; */ long variable_names_in_snake_case; long VariableNamesInPascalCase; long variableNamesInCamelCase; /* ** tip.2:PascalCase和camelCase在函數(shù)中的區(qū)分度較好, ** 在快速掃描代碼邏輯的時(shí)候不易被其它符號(hào)所干擾。 */ long FabonacciFunction(long rabbitNums) { if (rabbitNums < 2) { return rabbitNums; } long resultOne = FabonacciFunction(rabbitNums - 1); long resultTwo = FabonacciFunction(rabbitNums - 2); return resultOne + resultTwo; } long fabonacci_function(long rabbit_nums) { if (rabbit_nums < 2) { return rabbit_nums; } long result_one = fabonacci_function(rabbit_nums - 1); long result_two = fabonacci_function(rabbit_nums - 2); return result_one + result_two; }
tip.3:如果類(lèi)需要兼容標(biāo)準(zhǔn)庫(kù)迭代器或是要支持range for,begin()和end()函數(shù)會(huì)破壞PascalCase風(fēng)格的一致性;
1.6.類(lèi)成員變量和全局變量命名
/* ** 類(lèi)成員變量和全局變量的命名風(fēng)格和局部變量的命名風(fēng)格 ** 并沒(méi)有更多的區(qū)別。唯一的問(wèn)題是,是否要加前綴或后綴 ** 以方便和局部變量區(qū)分開(kāi)來(lái)。 */ class UserInfo { ... private: std::string user_name_; /* Google style */ std::string m_userName; /* Hungarian notation */ /* 不推薦前綴'_'的風(fēng)格,可能會(huì)和標(biāo)準(zhǔn)庫(kù)命名沖突 */ }; /* 全局變量要少用,推薦加前綴用于區(qū)分 */ extern "C" long g_commonCount;
tip.1:在有IDE提示時(shí),前綴"m_"的類(lèi)成員變量能夠很快被找到,如果不喜歡這種風(fēng)格,"this->"同樣也很便利;
1.7.常量和枚舉值命名
/* ** 常量和枚舉值的命名風(fēng)格建議和局部變量的命名風(fēng)格區(qū)分開(kāi), ** 常見(jiàn)的有全字母大寫(xiě)加'_'的風(fēng)格,PascalCase風(fēng)格,以及 ** Google加'k'前綴的風(fēng)格。 */ static const int DAYS_IN_WEEK = 7; static const int kDaysInWeek = 7; enum FileOpenMode { ReadOnly, WriteOnly, ReadWrite }; enum FileOpenMode { READ_ONLY, WRITE_ONLY, READ_WRITE };
tip.1:如果可以使用c++11特性,推薦enum class,否則可以在有歧義的枚舉值中重復(fù)枚舉類(lèi)型的名字;
1.8.宏命名
/* 宏命名推薦使用全字母大寫(xiě)加'_'分隔的風(fēng)格 */ #define OS_UNIX #define OS_LINUX #define OS_WINNT /* 除非你想用條件編譯將某些功能變?yōu)榭蛇x項(xiàng) */ #ifdef USE_TCMALLOC #define my_malloc tcmalloc #else #define my_malloc malloc #endif
tip.1:能用常量替代宏的地方盡量使用常量吧;
相關(guān)文章
C語(yǔ)言中的運(yùn)算符和結(jié)合性問(wèn)題
這篇文章主要介紹了C語(yǔ)言中的運(yùn)算符和結(jié)合性問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03C語(yǔ)言指針入門(mén)學(xué)習(xí)面面觀
這篇文章主要介紹了C語(yǔ)言指針的一些基礎(chǔ)知識(shí),指針可以說(shuō)是C語(yǔ)言入門(mén)學(xué)習(xí)中的頭等大事,文中從數(shù)組和函數(shù)等多方面剖析C中指針的作用,需要的朋友可以參考下2016-02-02C語(yǔ)言實(shí)現(xiàn)經(jīng)典24點(diǎn)紙牌益智游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)經(jīng)典24點(diǎn)紙牌益智游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10c++中深淺拷貝以及寫(xiě)時(shí)拷貝的實(shí)現(xiàn)示例代碼
這篇文章主要給大家介紹了關(guān)于c++中深淺拷貝以及寫(xiě)時(shí)拷貝實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08C++詳細(xì)分析講解函數(shù)參數(shù)的擴(kuò)展
在C++中,定義函數(shù)時(shí)可以給形參指定一個(gè)默認(rèn)的值,這樣調(diào)用函數(shù)時(shí)如果沒(méi)有給這個(gè)形參賦值(沒(méi)有對(duì)應(yīng)的實(shí)參),那么就使用這個(gè)默認(rèn)的值。也就是說(shuō),調(diào)用函數(shù)時(shí)可以省略有默認(rèn)值的參數(shù)2022-04-04適合初學(xué)者的C語(yǔ)言常量類(lèi)型的講解
常量是固定值,在程序執(zhí)行期間不會(huì)改變。這些固定的值,又叫做字面量。常量可以是任何的基本數(shù)據(jù)類(lèi)型,比如整數(shù)常量、浮點(diǎn)常量、字符常量,或字符串字面值,也有枚舉常量。常量就像是常規(guī)的變量,只不過(guò)常量的值在定義后不能進(jìn)行修改2022-04-04C++采用openfilename打開(kāi)文件對(duì)話框用法實(shí)例
這篇文章主要介紹了C++采用openfilename打開(kāi)文件對(duì)話框用法實(shí)例,是C++文件操作中非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10