說明
本文的目的是規(guī)范代碼書寫,使代碼具有較好的可讀性。
文檔中除"建議"贸人,"提倡"间景,"不提倡"文字外,其他均為強(qiáng)制要求艺智。
一般的倘要,建議c++程序員都去閱讀并參考一下google編程風(fēng)格指南,這是一個更加詳細(xì)的規(guī)范十拣,但略有復(fù)雜封拧,本規(guī)范對其進(jìn)行了簡化。
語言
- 頭文件保護(hù)
所有頭文件都應(yīng)該使用#define防止頭文件被多重包含夭问,命名格式為:<PROJECT>_<PATH>_<FILE>_H_
#ifndef FRPL_CORE_TIME_H_
#define FRPL_CORE_TIME_H_
...
#endif // FRPL_CORE_TIME_H_
- 宏定義
盡量不使用宏定義泽西,用內(nèi)聯(lián)函數(shù),const缰趋,枚舉代替
const int NUM_COUNT;
函數(shù)參數(shù)
定義函數(shù)時捧杉,參數(shù)順序為:輸入?yún)?shù)在前,輸出參數(shù)在后秘血。
新添加的輸入?yún)?shù)味抖,也要置于輸出參數(shù)之前命名空間
命名空間使用小寫字母,長度應(yīng)盡量短灰粮,可使用縮寫
代碼庫的命名空間frpl仔涩,其他項目代碼的命名空間為"項目名"
不提倡使用using(避免污染命名空間,提高編譯執(zhí)行速度),例如
using namespace std;
string aa;
而應(yīng)使用
std::string aa;
格式
使用"{"時新起一行粘舟。在整個函數(shù)只有一行時红柱,不考慮。
空格 vs 制表符
使用空格代替制表符蓖乘,每次縮進(jìn)4個空格锤悄。
為了保留使用tab的編碼習(xí)慣,可以在IDE上設(shè)置用空格替換制表符(每次使用tab時嘉抒,IDE會自動轉(zhuǎn)為4個空格)
VS2010設(shè)置方式:Tools ->Options ->Text Editor , C/C++ -> Tabs,選擇Insert spaces零聚,設(shè)置Tab size:4
Sublime2設(shè)置方式:首選項->設(shè)置默認(rèn)->修改為"tab_size":4, "translate_tabs_to_spaces": true
- 比較操作符,復(fù)制操作符“=”些侍、“+=”隶症,算術(shù)操作符“+”,“%”岗宣,邏輯操作符“&&”蚂会、“&”,位域操作符“<<”等雙目操作符的前后要加空格
a += b;
k = x + y;
單目操作符("!"耗式、"~"胁住、"++"趁猴、"--"、"&")彪见、函數(shù)參數(shù)缺省值"="前后無空格
逗號,分號只在后面加空格
void fun(int a, int b);
- 如一行語句過長儡司,則高級運(yùn)算符前后的空格可以省略
a*b + c*d
命名
- 通用命名規(guī)則
必須使用有意義的單詞或縮寫進(jìn)行命名,可以使用一些通用的單詞縮寫(如msg等)余指,可以但不提倡以英文單詞的前3~4個字母作為其縮寫捕犬;
命名規(guī)則:以大小駝峰式命名法為主,小寫字母加下劃線為輔
小駝峰法:第一個單字以小寫字母開始,第二個單字的首字母大寫酵镜。例如:firstName碉碉、lastName。
大駝峰法:每一個單字的首字母都采用大寫字母淮韭,例如:FirstName誉裆、LastName、CamelCase缸濒。
- 文件、目錄:小寫字母加下劃線
url_table.h
- 類型(類粱腻、結(jié)構(gòu)體庇配、枚舉):大駝峰法,無下劃線
class VideoAcqAVI ...
struct DetectMsg ...
- 變量:小寫字母加下劃線绍些、全小寫捞慌、小駝峰法均可,要在同一文件中保持一致
std::string table_name;
std::string tablename;
std::string tableName;
常量建議在名稱前加k, 全局變量建議在名稱前加g
const int kUseLimit = 9;
int gCashBalance;
- 函數(shù)
全局函數(shù)柬批、類內(nèi)普通函數(shù):大駝峰法啸澡,無下劃線
bool DetectVehicle()
類內(nèi)get/set/inline函數(shù):小寫字母+_+變量名
void set_table_name()
void set_tableName()
class VideoAcqAVI()
{
public:
bool Init();
void set_tableName();
private:
std::string tableName;
}
- 枚舉值、宏命名:全大寫+下劃線(不建議使用宏)
MY_EXCITING_ENUM_VALUE
- 前綴(類型名氮帐、全局函數(shù)嗅虏、鏈接庫)
暴露在命名空間全局作用域中的類型名、全局函數(shù)均以Fr開頭(即類內(nèi)函數(shù)不屬于此范疇)
動態(tài)上沐、靜態(tài)鏈接庫均以Fr開頭
明確用于內(nèi)部使用的類型皮服、函數(shù)、庫可以使用Fri開頭
注釋
doxygen注釋風(fēng)格
文件頭注釋
/**
*Copyright (c),2013, Freative
*
*@brief 簡述文件完成的主要功能
*@author 作者列表
*@version 版本
*@date 完成日期
*
*/
- 類参咙,函數(shù)龄广,變量注釋
/**
* @class 類名
* @brief 簡述
* @author 作者列表
* @note 細(xì)節(jié)描述
*/
- 函數(shù)注釋
/**
* @brief xx函數(shù)
* @param[in] a 參數(shù)說明
* @param[in] b 參數(shù)說明
* @param[in] c 參數(shù)說明
* @param[out] buf 輸出結(jié)果
* @return 0:函數(shù)執(zhí)行成功。
* @return 1:函數(shù)執(zhí)行失敗蕴侧,原因xxx
*/
- 類成員函數(shù)择同、成員變量注釋
/** 成員變量描述 */
int m_Var;
int m_color; /**< 顏色變量 */
- 枚舉類型注釋
/** @brief 枚舉類型說明 */
enum AnotherEnum
{
V1, /**< 值描述 */
V2 /**< 值描述 */
};
代碼注釋
對于實現(xiàn)代碼中巧妙的、晦澀的净宵、有趣的敲才、重要的地方加以注釋TODO,HACK,FIXME注釋
這類注釋用于在代碼中留下標(biāo)記裹纳,以便日后查找更改。
為方便搜索归斤,采用如下格式痊夭。TODO/HACK/FIXME(姓名或聯(lián)系方式):注釋內(nèi)容
注釋標(biāo)識 | 功能 |
---|---|
TODO | 有一些額外的工作還沒有做(但沒有bug) |
HACK | 采用了丑陋的方式解決了問題 |
FIXME | 有問題尚未解決 |
盡量不用FIXME,而是應(yīng)fix掉這個問題脏里。如果因時間不足解決方法丑陋她我,請用HACK標(biāo)記
// TODO(someone@fmail.com):xxx
// HACK(tom):xxx
// FIXME(jerry):xxx
windows特性
使用VS進(jìn)行編譯時,將警告級別設(shè)置為3級或更高迫横,并將所有warnings當(dāng)作errors處理
很多代碼會包含stdafx.h番舆,為方便代碼共享,不建議顯式包含此頭文件矾踱,而改為啟用編譯器選項FI以自動包含
代碼庫與項目開發(fā)
代碼庫(FRPL)會補(bǔ)充一些額外的規(guī)范用于限定該項目的源代碼恨狈。
在其他項目中,也可以補(bǔ)充額外的規(guī)范呛讲,且為了保證項目組的代碼一致性禾怠,可以有與本規(guī)范不同的約定。這些補(bǔ)充和變化都應(yīng)在項目文檔中注明贝搁。
對于歷史遺留項目吗氏,不改變原代碼風(fēng)格