Google C++ 编码风格精简
? Google C++?編碼風(fēng)格精簡(jiǎn)
頭文件:
1.頭文件防多重定義define格式:<PROJECT>_<PATH>_<FILE>_H_
2.能使用前置聲明盡量不用頭文件包含
3.只有當(dāng)函數(shù)只有?10?行甚至更少時(shí)才將其定義為內(nèi)聯(lián)函數(shù)(注意虛函數(shù),遞歸函數(shù),以及使用了循環(huán)語(yǔ)句的函數(shù))
4.復(fù)雜的內(nèi)聯(lián)函數(shù)的定義,?放在后綴名為?-inl.h?的頭文件中
5.定義函數(shù)時(shí),輸入?yún)?shù)永遠(yuǎn)放在輸出參數(shù)之前
6.項(xiàng)目?jī)?nèi)頭文件應(yīng)按照項(xiàng)目源代碼目錄樹結(jié)構(gòu)排列
7.example.cc包含頭文件順序:example.h,C系統(tǒng)文件,C++?系統(tǒng)文件,其他庫(kù)的h文件,本項(xiàng)目?jī)?nèi)h文件
?
?
作用域:
1.在.cc文件中,?允許甚至鼓勵(lì)使用匿名名字空間;不要在h文件中使用匿名名字空間?
2.在.cc文件.h文件的函數(shù),?方法或類中,?可以使用?"using"關(guān)鍵字?及?名字空間別名?
3.不要將嵌套類定義成公有,?除非它們是接口的一部分,?比如,?嵌套類含有某些方法的一組選項(xiàng)
4.使用靜態(tài)成員函數(shù)或名字空間內(nèi)的非成員函數(shù),?盡量不要用裸的全局函數(shù)?
5.將函數(shù)變量盡可能置于最小作用域內(nèi),?并在變量聲明時(shí)進(jìn)行初始化
6.禁止使用?class?類型的靜態(tài)或全局變量:?它們會(huì)導(dǎo)致很難發(fā)現(xiàn)的?bug?和不確定的構(gòu)造和析構(gòu)函數(shù)調(diào)用順序
?
?
類:
1.構(gòu)造函數(shù)中只進(jìn)行那些沒(méi)什么意義的初始化,?可能的話,?使用?Init()?方法集中初始化有意義的數(shù)據(jù)
2.如果一個(gè)類定義了若干成員變量又沒(méi)有其它構(gòu)造函數(shù),?必須定義一個(gè)默認(rèn)構(gòu)造函數(shù)
3.對(duì)單個(gè)參數(shù)的構(gòu)造函數(shù)使用?C++?關(guān)鍵字?explicit(如果構(gòu)造函數(shù)只有一個(gè)參數(shù),?可看成是一種隱式轉(zhuǎn)換)
4.僅在代碼中需要拷貝一個(gè)類對(duì)象的時(shí)候使用拷貝構(gòu)造函數(shù);?大部分情況下都不需要,?此時(shí)應(yīng)使用?DISALLOW_COPY_AND_ASSIGN
{
#define?DISALLOW_COPY_AND_ASSIGN(TypeName)?/
TypeName(const?TypeName&);?/
void?operator=(const?TypeName&)
}
5.僅當(dāng)只有數(shù)據(jù)時(shí)使用?struct,?其它一概使用?class
6.使用組合常常比使用繼承更合理.?如果使用繼承的話,?定義為?public?繼承
7.如果你的類有虛函數(shù),?則析構(gòu)函數(shù)也應(yīng)該為虛函數(shù)
8.當(dāng)重載一個(gè)虛函數(shù),?在衍生類中把它明確的聲明為?virtual
9.只在以下情況我們才允許多重繼承:?最多只有一個(gè)基類是非抽象類;?其它基類都是以Interface為后綴的純接口類
10.接口是指滿足特定條件的類,?這些類以?Interface?為后綴?(不強(qiáng)制).
11.盡量不要重載運(yùn)算符
12.數(shù)據(jù)成員在任何情況下都必須是私有的,?并根據(jù)需要提供相應(yīng)的存取函數(shù)
13.在類中使用特定的聲明順序:?public:?在?private:?之前,?成員函數(shù)在數(shù)據(jù)成員前
14.如果函數(shù)超過(guò)?40?行,?可以思索一下能不能在不影響程序結(jié)構(gòu)的前提下對(duì)其進(jìn)行分割
?
Google奇技:
1.盡量避免使用智能指針(任何情況下都不要使用?auto_ptr),使用時(shí)也盡量局部化
2.使用?cpplint.py?檢查風(fēng)格錯(cuò)誤
?
C++特性:
1.?輸入?yún)?shù)是值參或?const?引用,?輸出參數(shù)為指針.
2.僅在輸入?yún)?shù)類型不同,?功能相同時(shí)使用重載函數(shù)?(含構(gòu)造函數(shù))
3.不允許使用缺省函數(shù)參數(shù)
4.不允許使用變長(zhǎng)數(shù)組和?alloca()
5.不要在?Google?的開源項(xiàng)目中使用異常(關(guān)于這一點(diǎn)google僅僅是為了自身方便=。=)
6.禁止使用RTTI
7.使用?C++?的類型轉(zhuǎn)換,?如?static_cast<>().?不要使用?int?y?=?(int)x?或?int?y?=?int(x)?等轉(zhuǎn)換方式
{
用?static_cast?替代?C?風(fēng)格的值轉(zhuǎn)換,?或某個(gè)類指針需要明確的向上轉(zhuǎn)換為父類指針時(shí)
用?const_cast?去掉?const?限定符
用?reinterpret_cast?指針類型和整型或其它指針之間進(jìn)行不安全的相互轉(zhuǎn)換.?僅在你對(duì)所做一切了然于心時(shí)使用?dynamic_cast?測(cè)試代碼以外不要使用.?除非是單元測(cè)試,?如果你需要在運(yùn)行時(shí)確定類型信息,?說(shuō)明有?設(shè)計(jì)缺陷
}
8.只在記錄日志時(shí)使用流
9.對(duì)迭代器和模板類型,?使用前置自增?(自減).對(duì)簡(jiǎn)單數(shù)值?(非對(duì)象)無(wú)所謂
10.強(qiáng)烈建議你在任何可能的情況下都要使用?const
{
如果函數(shù)不會(huì)修改傳入的引用或指針類型參數(shù),?該參數(shù)應(yīng)聲明為?const.
盡可能將函數(shù)聲明為?const.?訪問(wèn)函數(shù)應(yīng)該總是?const.?其他不會(huì)修改任何數(shù)據(jù)成員,?未調(diào)用非?const?函數(shù),?不會(huì)返回?cái)?shù)據(jù)成員非?const?指針或引用的函數(shù)也應(yīng)該聲明成?const.
如果數(shù)據(jù)成員在對(duì)象構(gòu)造之后不再發(fā)生變化,?可將其定義為?const.
}
11.C++?內(nèi)建整型中,?僅使用?int.?如果程序中需要不同大小的變量,?可以使用?<stdint.h>?中長(zhǎng)度精確的整型,?如?int16_t
12.使用斷言來(lái)指出變量為非負(fù)數(shù),?而不是使用無(wú)符號(hào)型
13.代碼應(yīng)該對(duì)?64?位和?32?位系統(tǒng)友好(!!!)
14.使用宏時(shí)要非常謹(jǐn)慎,?盡量以內(nèi)聯(lián)函數(shù),?枚舉和常量代替之
{
不要在?.h?文件中定義宏
在馬上要使用時(shí)才進(jìn)行?#define,?使用后要立即?#undef
不要只是對(duì)已經(jīng)存在的宏使用#undef,選擇一個(gè)不會(huì)沖突的名稱
不要試圖使用展開后會(huì)導(dǎo)致?C++?構(gòu)造不穩(wěn)定的宏,?不然也至少要附上文檔說(shuō)明其行為
}
15.整數(shù)用?0,?實(shí)數(shù)用?0.0,?指針用?NULL,?字符?(串)?用?'/0'
16.盡可能用?sizeof(varname)?代替?sizeof(type)
17.只使用?Boost?中被認(rèn)可的庫(kù)
?
命名約定:
1.函數(shù)命名,?變量命名,?文件命名應(yīng)具備描述性;?不要過(guò)度縮寫.?類型和變量應(yīng)該是名詞,?函數(shù)名可以用?“命令性”?動(dòng)詞
2.文件名要全部小寫,?可以包含下劃線?(_)?或連字符?(-).?按項(xiàng)目約定來(lái).
3.類型名稱的每個(gè)單詞首字母均大寫,?不包含下劃線:?MyExcitingClass,?MyExcitingEnum.
4.變量名一律小寫,?單詞之間用下劃線連接.?類的成員變量以下劃線結(jié)尾:my_local_variable,my_member_variable_
5.結(jié)構(gòu)體的數(shù)據(jù)成員可以和普通變量一樣,?不用像類那樣接下劃線
6.常量命名?在名稱前加?k,接大寫字母開頭的單詞
7.函數(shù)名的每個(gè)單詞首字母大寫,?沒(méi)有下劃線,取值和設(shè)值函數(shù)要與存取的變量名匹配.非常短小的內(nèi)聯(lián)函數(shù)名也可以用小寫字母
8.名字空間用小寫字母命名,?并基于項(xiàng)目名稱和目錄結(jié)構(gòu):?google_awesome_project.
9.枚舉的命名應(yīng)當(dāng)和常量一致:?kEnumName.
?
?
代碼注釋:
1.使用行注釋或塊注釋,統(tǒng)一就好
2.在每一個(gè)文件開頭加入版權(quán)公告,然后是文件內(nèi)容描述
{
版權(quán);
許可版本:Apache2.0?BSD?LGPL?GPL;
作者;
文件內(nèi)容
}
3.每個(gè)類的定義要附著類的功能和用法的注釋
4.函數(shù)聲明處注釋描述函數(shù)功能,定義處描述函數(shù)實(shí)現(xiàn)
5.類數(shù)據(jù)成員應(yīng)注釋說(shuō)明用途,是否可以接受NULL或-1等警戒值
6.全局變量注釋說(shuō)明含義和用途
7.復(fù)雜代碼前要加注釋;比較隱晦的代碼后空兩格加行尾注釋
8.向函數(shù)傳入整型,布爾值和指針時(shí),注釋說(shuō)明含義,或使用常量讓代碼望文知意
9.臨時(shí),短期,或不夠完美的解決方案使用TODO注釋;格式//TODO(ID):Information
?
?
格式:
1.每一行長(zhǎng)度不要超過(guò)80(路徑,URL,頭文件保護(hù)除外)
2.盡量不使用非ASCII字符,使用時(shí)必須使用UTF-8字符
3.只使用空格,每次縮進(jìn)兩個(gè)空格
4.函數(shù)聲明:返回值和函數(shù)名在同一行,參數(shù)也盡量放在同一行
{
返回值總是和函數(shù)名在同一行;
左圓括號(hào)總是和函數(shù)名在同一行;
函數(shù)名和左圓括號(hào)間沒(méi)有空格
圓括號(hào)與參數(shù)間沒(méi)有空格;
左大括號(hào)總在最后一個(gè)參數(shù)同一行的末尾處?;
右大括號(hào)總是單獨(dú)位于函數(shù)最后一行;
右圓括號(hào)和左大括號(hào)間總是有一個(gè)空格;
函數(shù)聲明和實(shí)現(xiàn)處的所有形參名稱必須保持一致;
所有形參應(yīng)盡可能對(duì)齊;
缺省縮進(jìn)為2個(gè)空格;
換行后的參數(shù)保持4個(gè)空格的縮進(jìn);
}
5.如果函數(shù)聲明成const,關(guān)鍵字const應(yīng)與最后一個(gè)參數(shù)位于同一行?
6.如果有些參數(shù)沒(méi)有用到,?在函數(shù)定義處將參數(shù)名注釋起來(lái)
7.函數(shù)調(diào)用盡量放在同一行,?否則,?將實(shí)參封裝在圓括號(hào)中
8.switch?語(yǔ)句可以使用大括號(hào)分段.?空循環(huán)體應(yīng)使用?{}?或?continue.?
9.如果一個(gè)布爾表達(dá)式超過(guò)標(biāo)準(zhǔn)行寬斷行方式要統(tǒng)一
10.return?表達(dá)式中不要用圓括號(hào)包圍
11.預(yù)處理指令不要縮進(jìn),?從行首開始?
12.訪問(wèn)控制塊的聲明依次序是?public:,?protected:,?private:,?每次縮進(jìn)?1?個(gè)空格?
13.構(gòu)造函數(shù)初始化列表放在同一行或按四格縮進(jìn)并排幾行
14.名字空間內(nèi)容不增加縮進(jìn)層次
15.永遠(yuǎn)不要在行尾添加沒(méi)意義的留白
16.不在萬(wàn)不得已,?不要使用空行.?尤其是:?兩個(gè)函數(shù)定義之間的空行不要超過(guò)?2?行,?函數(shù)體首尾不要留空行,?函數(shù)體中也不要隨意添加空行?
?
?
規(guī)則特例:
對(duì)于Windows程序員:
1.不要使用匈牙利命名法,使用?Google?命名約定,?包括對(duì)源文件使用?.cc?擴(kuò)展名
2.盡量使用原有的?C++?類型?
3.使用?Microsoft?Visual?C++?進(jìn)行編譯時(shí),?將警告級(jí)別設(shè)置為?3?或更高,?并將所有?warnings?當(dāng)作?errors?處理?
4.不要使用?#pragma?once;?而應(yīng)該使用?Google?的頭文件保護(hù)規(guī)則?
5.除非萬(wàn)不得已,?不要使用任何非標(biāo)準(zhǔn)的擴(kuò)展,?
總結(jié)
以上是生活随笔為你收集整理的Google C++ 编码风格精简的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IOC注解注入View
- 下一篇: java HelloWorld 编程风格