日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Google C 編程規(guī)范

 taotao_2016 2019-09-02

一、頭文件

1. #define 的保護

2. 頭文件依賴

3. 內(nèi)聯(lián)函數(shù)

4. -inl.h 文件

5. 函數(shù)參數(shù)順序(Function Parameter Ordering)

6. 包含文件的名稱及次序

二、作用域

1. 命名空間(Namespaces)

2. 嵌套類(Nested Class)

3. 非成員函數(shù)( Nonmember)、靜態(tài)成員函數(shù)( Static Member)和全局函數(shù)(Global Functions)

4. 局部變量(Local Variables)

5. 全局變量(Global Variables)

三、類

1. 構(gòu)造函數(shù)(Constructor)的職責(zé)

2. 默認(rèn)構(gòu)造函數(shù)(Default Constructors)

3. 明確的構(gòu)造函數(shù)(Explicit Constructors)

4. 拷貝構(gòu)造函數(shù)(Copy Constructors)

5. 結(jié)構(gòu)體和類(Structs vs. Classes)

6. 繼承(Inheritance)

7. 多重繼承(Multiple Inheritance)

8. 接口(Interface)

9. 操作符重載(Operator Overloading)

10. 存取控制(Access Control)

11. 聲明次序(Declaration Order)

12. 編寫短小函數(shù)(Write Short Functions)

四、Google 特有的風(fēng)情

1. 智能指針(Smart Pointers)

五、其他C++特性

1. 引用參數(shù)(Reference Arguments)

2. 函數(shù)重載(Function Overloading)

3. 缺省參數(shù)(Default Arguments)

4. 變長數(shù)組和alloca(Variable-Length Arrays and alloca())

5. 友元(Friends)

6. 異常(Exceptions)

7. 運行時類型識別(Run-Time Type Information, RTTI)

8. 類型轉(zhuǎn)換(Casting)

9. 流(Streams)

10. 前置自增和自減(Preincrement and Predecrement)

11. const 的使用(Use of const)

12. 整型(Integer Types)

13. 64 位下的可移植性(64-bit Portability)

14. 預(yù)處理宏(Preprocessor Macros)

15. 0 和 NULL(0 and NULL)

16. sizeof(sizeof)

17. Boost 庫(Boost)

六、命名約定

1. 通用命名規(guī)則(General Naming Rules)

2. 文件命名(File Names)

3. 類型命名(Type Names)

4. 變量命名(Variable Names)

5. 常量命名(Constant Names)

6. 函數(shù)命名(Function Names)

7. 命名空間(Namespace Names)

8. 枚舉命名(Enumerator Names)

9. 宏命名(Macro Names)

10. 命名規(guī)則例外(Exceptions to Naming Rules)

七、注釋

1. 注釋風(fēng)格(Comment Style)

2. 文件注釋(File Comments)

3. 類注釋(Class Comments)

4. 函數(shù)注釋(Function Comments)

5. 變量注釋(Variable Comments)

6. 實現(xiàn)注釋(Implementation Comments)

7. 標(biāo)點、拼寫和語法(Punctuation, Spelling and Grammar)

8. TODO 注釋(TODO Comments)

八、格式

1. 行長度(Line Length)

2. 非 ASCII 字符(Non-ASCII Characters)

3. 空格還是制表位(Spaces vs. Tabs)

4. 函數(shù)聲明與定義(Function Declarations and Definitions)

5. 函數(shù)調(diào)用(Function Calls)

6. 條件語句(Conditionals)

7. 循環(huán)和開關(guān)選擇語句(Loops and Switch Statements)

8. 指針和引用表達(dá)式(Pointers and Reference Expressions)

9. 布爾表達(dá)式(Boolean Expressions)

10. 函數(shù)返回值(Return Values)

11. 變量及數(shù)組初始化(Variable and Array Initialization)

12. 預(yù)處理指令(Preprocessor Directives)

13. 類格式(Class Format)

14. 初始化列表(Initializer Lists)

15. 命名空間格式化(Namespace Formatting)

16. 水平留白(Horizontal Whitespace)

17. 垂直留白(Vertical Whitespace)

九、規(guī)則之例外

1. 現(xiàn)有不統(tǒng)一代碼(Existing Non-conformant Code)

2. Windows 代碼(Windows Code)

十、團隊合作

一、頭文件

通常,每一個.cc 文件(C++的源文件)都有一個對應(yīng)的.h 文件(頭文件),也有一些例

外,如單元測試代碼和只包含main()的.cc 文件。

正確使用頭文件可令代碼在可讀性、文件大小和性能上大為改觀。

下面的規(guī)則將引導(dǎo)你規(guī)避使用頭文件時的各種麻煩。

1. #define的保護

所有頭文件都應(yīng)該使用#define 防止頭文件被多重包含(multiple inclusion),命名格式

當(dāng)是:<PROJECT>_<PATH>_<FILE>_H_

為保證唯一性,頭文件的命名應(yīng)基于其所在項目源代碼樹的全路徑。例如,項目foo 中的頭

文件foo/src/bar/baz.h 按如下方式保護:

#ifndef FOO_BAR_BAZ_H_

#define FOO_BAR_BAZ_H_

...

#endif // FOO_BAR_BAZ_H_

2. 頭文件依賴

使用前置聲明(forward declarations)盡量減少.h 文件中#include 的數(shù)量。

當(dāng)一個頭文件被包含的同時也引入了一項新的依賴(dependency),只要該頭文件被修改,

代碼就要重新編譯。如果你的頭文件包含了其他頭文件,這些頭文件的任何改變也將導(dǎo)致那

些包含了你的頭文件的代碼重新編譯。因此,我們寧可盡量少包含頭文件,尤其是那些包含

在其他頭文件中的。

使用前置聲明可以顯著減少需要包含的頭文件數(shù)量。舉例說明:頭文件中用到類File,但不

需要訪問File 的聲明,則頭文件中只需前置聲明class File;無需#include

'file/base/file.h'。

在頭文件如何做到使用類Foo 而無需訪問類的定義?

1) 將數(shù)據(jù)成員類型聲明為Foo *或Foo &;

2) 參數(shù)、返回值類型為Foo 的函數(shù)只是聲明(但不定義實現(xiàn));

3) 靜態(tài)數(shù)據(jù)成員的類型可以被聲明為Foo,因為靜態(tài)數(shù)據(jù)成員的定義在類定義之外。

另一方面,如果你的類是Foo 的子類,或者含有類型為Foo 的非靜態(tài)數(shù)據(jù)成員,則必須為

之包含頭文件。

有時,使用指針成員(pointer members,如果是scoped_ptr 更好)替代對象成員(object

members)的確更有意義。然而,這樣的做法會降低代碼可讀性及執(zhí)行效率。如果僅僅為

了少包含頭文件,還是不要這樣替代的好。

當(dāng)然,.cc 文件無論如何都需要所使用類的定義部分,自然也就會包含若干頭文件。

譯者注:能依賴聲明的就不要依賴定義。

3. 內(nèi)聯(lián)函數(shù)

只有當(dāng)函數(shù)只有10 行甚至更少時才會將其定義為內(nèi)聯(lián)函數(shù)(inline function)。

定義(Definition):當(dāng)函數(shù)被聲明為內(nèi)聯(lián)函數(shù)之后,編譯器可能會將其內(nèi)聯(lián)展開,無需

按通常的函數(shù)調(diào)用機制調(diào)用內(nèi)聯(lián)函數(shù)。

優(yōu)點:當(dāng)函數(shù)體比較小的時候,內(nèi)聯(lián)該函數(shù)可以令目標(biāo)代碼更加高效。對于存取函數(shù)

(accessor、mutator)以及其他一些比較短的關(guān)鍵執(zhí)行函數(shù)。

缺點:濫用內(nèi)聯(lián)將導(dǎo)致程序變慢,內(nèi)聯(lián)有可能是目標(biāo)代碼量或增或減,這取決于被內(nèi)聯(lián)的函

數(shù)的大小。內(nèi)聯(lián)較短小的存取函數(shù)通常會減少代碼量,但內(nèi)聯(lián)一個很大的函數(shù)(譯者注:如

果編譯器允許的話)將戲劇性的增加代碼量。在現(xiàn)代處理器上,由于更好的利用指令緩存

(instruction cache),小巧的代碼往往執(zhí)行更快。

結(jié)論:一個比較得當(dāng)?shù)奶幚硪?guī)則是,不要內(nèi)聯(lián)超過10 行的函數(shù)。對于析構(gòu)函數(shù)應(yīng)慎重對待,

析構(gòu)函數(shù)往往比其表面看起來要長,因為有一些隱式成員和基類析構(gòu)函數(shù)(如果有的話)被

調(diào)用!

另一有用的處理規(guī)則:內(nèi)聯(lián)那些包含循環(huán)或switch 語句的函數(shù)是得不償失的,除非在大多

數(shù)情況下,這些循環(huán)或switch 語句從不執(zhí)行。

重要的是,虛函數(shù)和遞歸函數(shù)即使被聲明為內(nèi)聯(lián)的也不一定就是內(nèi)聯(lián)函數(shù)。通常,遞歸函數(shù)

不應(yīng)該被聲明為內(nèi)聯(lián)的(譯者注:遞歸調(diào)用堆棧的展開并不像循環(huán)那么簡單,比如遞歸層數(shù)

在編譯時可能是未知的,大多數(shù)編譯器都不支持內(nèi)聯(lián)遞歸函數(shù))。析構(gòu)函數(shù)內(nèi)聯(lián)的主要原因

是其定義在類的定義中,為了方便抑或是對其行為給出文檔。

4. -inl.h文件

復(fù)雜的內(nèi)聯(lián)函數(shù)的定義,應(yīng)放在后綴名為-inl.h 的頭文件中。

在頭文件中給出內(nèi)聯(lián)函數(shù)的定義,可令編譯器將其在調(diào)用處內(nèi)聯(lián)展開。然而,實現(xiàn)代碼應(yīng)完

全放到.cc 文件中,我們不希望.h 文件中出現(xiàn)太多實現(xiàn)代碼,除非這樣做在可讀性和效率上

有明顯優(yōu)勢。

如果內(nèi)聯(lián)函數(shù)的定義比較短小、邏輯比較簡單,其實現(xiàn)代碼可以放在.h 文件中。例如,存

取函數(shù)的實現(xiàn)理所當(dāng)然都放在類定義中。出于實現(xiàn)和調(diào)用的方便,較復(fù)雜的內(nèi)聯(lián)函數(shù)也可以

放到.h 文件中,如果你覺得這樣會使頭文件顯得笨重,還可以將其分離到單獨的-inl.h 中。

這樣即把實現(xiàn)和類定義分離開來,當(dāng)需要時包含實現(xiàn)所在的-inl.h 即可。

-inl.h 文件還可用于函數(shù)模板的定義,從而使得模板定義可讀性增強。

要提醒的一點是,-inl.h 和其他頭文件一樣,也需要#define 保護。

5. 函數(shù)參數(shù)順序(Function Parameter Ordering)

定義函數(shù)時,參數(shù)順序為:輸入?yún)?shù)在前,輸出參數(shù)在后。

C/C++函數(shù)參數(shù)分為輸入?yún)?shù)和輸出參數(shù)兩種,有時輸入?yún)?shù)也會輸出(譯者注:值被修

改時)。輸入?yún)?shù)一般傳值或常數(shù)引用(const references),輸出參數(shù)或輸入/輸出參數(shù)

為非常數(shù)指針(non-const pointers)。對參數(shù)排序時,將所有輸入?yún)?shù)置于輸出參數(shù)之

前。不要僅僅因為是新添加的參數(shù),就將其置于最后,而應(yīng)該依然置于輸出參數(shù)之前。

這一點并不是必須遵循的規(guī)則,輸入/輸出兩用參數(shù)(通常是類/結(jié)構(gòu)體變量)混在其中,會

使得規(guī)則難以遵循。

Google C++ 編程規(guī)范

Google C++ 編程規(guī)范

Google C++ 編程規(guī)范

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多