C&C++設(shè)計風格選擇 命名規(guī)范
1.命名規(guī)范
1.1.常見命名法
然而,當面對復雜情況時就有些棘手,給全局變量取一個描述性的名字是必要的。把一個全局函數(shù)叫做“foo”是一種目光短淺的行為。全局函數(shù)也一樣,如果你有一個統(tǒng)計當前用戶個數(shù)的函數(shù),應(yīng)當把它命名為“count_active_user()”或者簡單點些的類似名稱,不應(yīng)該命名為“cntusr()”。
printEmployeePaychecks();
print_employee_paychecks();
匈牙利命名法關(guān)鍵是:標識符的名字以一個或者多個小寫字母開頭作為前綴;前綴之后的是首字母大寫的一個單詞或多個單詞組合,該單詞要指明變量的用途。
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 );
即開頭字母用變量的類型,其余部分用變量的英文意思、英文的縮寫、中文全拼或中文全拼的縮寫,要求單詞的第一個字母應(yīng)大寫。
即: 變量名=變量類型+變量的英文意思(或英文縮寫、中文全拼、中文全拼縮寫)
對非通用的變量,在定義時加入注釋說明,變量定義盡量可能放在函數(shù)的開始處。
見下表:
bool 用b開頭 bFlg
int 用i開頭 iCount
short int 用n開頭 nStepCount
long int 用l開頭 lSum
char 用c開頭 cCount
unsigned char 用by開頭
float 用f開頭 fAvg
double 用d開頭 dDeta
unsigned int(WORD) 用w開頭 wCount
unsigned long int(DWORD) 用dw開頭 dwBroad
字符串 用s開頭 sFileName
用0結(jié)尾的字符串 用sz開頭 szFileName
對一重指針變量的基本原則為:“p”+變量類型前綴+命名,如一個float*型應(yīng)該表示為pfStat。對二重指針變量的基本規(guī)則為:“pp”+變量類型前綴+命名。對三重指針變量的基本規(guī)則為:“ppp”+變量類型前綴+命名。
enum cmEMDAYS
{
EMDAYS_MONDAY;
EMDAYS_TUESDAY;
……
};
struct ScmNPoint
{
int nX;//點的X位置
int nY; //點的Y位置
};
union UcmLPoint
{
LONG lX;
LONG lY;
}
如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示類別。
LONG GetDeviceCount(……);
void print_record( unsigned int rec_ind ) ;
int input_record( void ) ;
unsigned char get_current_color( void ) ;
應(yīng)確保每個函數(shù)聲明中的參數(shù)的名稱、類型和定義中的名稱、類型一致。
(2)為了提高程序的運行效率,減少參數(shù)占用的堆棧,傳遞大結(jié)構(gòu)的參數(shù),一律采用指針或引用方式傳遞。
(3)為了便于其他程序員識別某個指針參數(shù)是入口參數(shù)還是出口參數(shù),同時便于編譯器檢查錯誤,應(yīng)該在入口參數(shù)前加入const標志。
如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)
1.2.文件命名
# C語言不糾結(jié) file.h & file.c # C++ Group.1(注意C是大寫) 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:各組合可以混搭,比如常見的file.cpp搭配file.h和Google風格的file.cc搭配file.h;
tip.3:強迫癥可以選擇不混搭的各組,這樣看起來有對稱感;
tip.4:不要選擇第1組大寫C的后綴,特別是在Windows這樣不區(qū)分大小寫的操作系統(tǒng)上;
tip.5:一些后綴名可能不被某些較老的編譯器或IDE所默認支持,例如vs2005默認沒有擴展.hh后綴;
tip.6:如果需要跨平臺,推薦選擇第3組,至少boost是這么選的;
# Teddy項目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:各組文件名風格都沒有明顯的缺點,但要注意在區(qū)分大小寫的系統(tǒng)上UserLog.c和userlog.c是兩個文件;
1.3.類型命名
/* ** 基本數(shù)據(jù)類型的重定義,小寫比首字母大寫更有利于延長Shift壽命, ** 但也更容易產(chǎn)生命名沖突。 */ typedef unsigned char byte; typedef unsigned char byte_t; typedef unsigned char Byte; typedef unsigned char Byte_t; /* ** 類與結(jié)構(gòu)體常見的風格是采用PascalCase,不推薦使用camelCase ** 這種怪異的風格。 */ class HashTable { ... class hash_table { ... struct FileInfo { ... struct file_info { ... /* C語言常見到的風格還有結(jié)構(gòu)體名稱加'_t'后綴 */ struct fileinfo_t { ... struct FileInfo_t { ... /* 枚舉命名常見PascalCase風格 */ enum FileFlags { ... enum file_flags { ...
tip.1:c語言沒有命名空間,為防止命名沖突,常見做法是將項目名或其縮寫作為類型名稱前綴;
tip.2:類,結(jié)構(gòu)體,枚舉的命名風格盡量保持一致;
1.4.命名空間命名
/* 一般使用項目名稱,風格看喜好。 */ namespace my_project { ... namespace MyProject { ...
tip.1:確保命名空間不會和常用的庫沖突;
1.5.函數(shù)和變量命名
/* ** 在函數(shù)和變量命名風格上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在名稱比較長時可讀性較好; */ long variable_names_in_snake_case; long VariableNamesInPascalCase; long variableNamesInCamelCase; /* ** tip.2:PascalCase和camelCase在函數(shù)中的區(qū)分度較好, ** 在快速掃描代碼邏輯的時候不易被其它符號所干擾。 */ 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:如果類需要兼容標準庫迭代器或是要支持range for,begin()和end()函數(shù)會破壞PascalCase風格的一致性;
1.6.類成員變量和全局變量命名
/* ** 類成員變量和全局變量的命名風格和局部變量的命名風格 ** 并沒有更多的區(qū)別。唯一的問題是,是否要加前綴或后綴 ** 以方便和局部變量區(qū)分開來。 */ class UserInfo { ... private: std::string user_name_; /* Google style */ std::string m_userName; /* Hungarian notation */ /* 不推薦前綴'_'的風格,可能會和標準庫命名沖突 */ }; /* 全局變量要少用,推薦加前綴用于區(qū)分 */ extern "C" long g_commonCount;
tip.1:在有IDE提示時,前綴"m_"的類成員變量能夠很快被找到,如果不喜歡這種風格,"this->"同樣也很便利;
1.7.常量和枚舉值命名
/* ** 常量和枚舉值的命名風格建議和局部變量的命名風格區(qū)分開, ** 常見的有全字母大寫加'_'的風格,PascalCase風格,以及 ** Google加'k'前綴的風格。 */ 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,否則可以在有歧義的枚舉值中重復枚舉類型的名字;
1.8.宏命名
/* 宏命名推薦使用全字母大寫加'_'分隔的風格 */ #define OS_UNIX #define OS_LINUX #define OS_WINNT /* 除非你想用條件編譯將某些功能變?yōu)榭蛇x項 */ #ifdef USE_TCMALLOC #define my_malloc tcmalloc #else #define my_malloc malloc #endif
tip.1:能用常量替代宏的地方盡量使用常量吧;
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實現(xiàn)表達式求值的方法詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運算符做加法
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery