1. 程式人生 > >GooGle c++編碼風格--標頭檔案

GooGle c++編碼風格--標頭檔案

本文所學習的GooGle規範下載於:

前言:雖然Google的風格很規範,可是一萬個人有一萬個哈姆雷特,所以結合規範風格,引申出適合自己的風格才是最好的。

1.標頭檔案

1.1#define保護

 用於防止某個.h檔案被多重包含,命名格式<PROJECT>_<PATH>_<FILE>_H_

Ex:為保證唯一性, 標頭檔案的命名應該依據所在專案原始碼樹的全路徑. 例如, 專案 foo 中的標頭檔案 foo/src/bar/baz.h 可按如下方式保護:

#ifndef FOO_BAR_BAZ_H_

#define FOO_BAR_BAZ_H_

#endif // FOO_BAR_BAZ_H_

如果專案不是太大,許多.h檔案實唯一的,可簡單的使用<FILE>_H_即可,上面寫成

#ifndef BAZ_H_

#define BAZ_H_

#endif // BAZ_H_

1.2標頭檔案依賴

       當某個檔案被包含的同時,這個檔案又包含了其他的標頭檔案,那麼當這個檔案修改時,程式碼會重新編譯,而這個標頭檔案所包含的檔案也會被重新編譯、、,這樣依次會導致許多檔案被過多編譯。

所以使用前置宣告來減少需要包含的標頭檔案數量。

Ex:

如果標頭檔案中用到類File,可是不需要訪問File的宣告(即不用函式等等),那麼標頭檔案只需前置宣告class File;而 不用#include “file.h

而此時你能用分類操作為:

  • 我們可以將資料成員型別宣告為 Foo * 或 Foo &.
  • 我們可以將函式引數 / 返回值的型別宣告為 Foo (但不能定義實現).
  • 我們可以將靜態資料成員的型別宣告為 Foo, 因為靜態資料成員的定義在類定義之外.

可是記住:不要為了減少標頭檔案的包含,而過多的使用指標來代替物件成員。

1.3行內函數

只有當函式只有 10 行甚至更少時才將其定義為行內函數.

這裡不做討論,因為一般情況下,用的很少。

只寫一些經驗:

一個較為合理的經驗準則是, 不要內聯超過 10 行的函式. 謹慎對待解構函式, 解構函式往往比其表面看起來要更長, 因為有隱含的成員和基類解構函式被呼叫!

內聯那些包含迴圈或 switch 語句的函式常常是得不償失 (除非在大多數情況下, 這些迴圈或 switch 語句從不被執行).

有些函式即使宣告為內聯的也不一定會被編譯器內聯, 這點很重要; 比如虛擬函式和遞迴函式就不會被正常內聯. 通常, 遞迴函式不應該宣告成行內函數.(

1.4 -inl.h

這是用來儲存行內函數的實現的,一般行內函數的實現放在對應的.h檔案裡面,可是當行內函數過大時,會造成.h檔案的笨重,所以可以將行內函數寫到-inl.h檔案進行實現。

1.5 函式引數的順序

定義函式時, 引數順序依次為: 輸入引數, 然後是輸出引數.

       C/C++ 函式引數分為輸入引數, 輸出引數, 和輸入/輸出引數三種. 輸入引數一般傳值或傳 const 引用, 輸出引數或輸入/輸出引數則是非-const 指標. 對引數排序時, 將只輸入的引數放在所有輸出引數之前. 尤其是不要僅僅因為是新加的引數, 就把它放在最後; 即使是新加的只輸入引數也要放在輸出引數.

       這條規則並不需要嚴格遵守. 輸入/輸出兩用引數 (通常是類/結構體變數) 把事情變得複雜, 為保持和相關函式的一致性, 你有時不得不有所變通.

1.6 #include的路徑即順序

使用標準的標頭檔案包含順序可增強可讀性, 避免隱藏依賴: C 庫, C++ 庫, 其他庫的 .h, 本專案內的 .h.

我們希望每一個頭檔案都是可被獨立編譯的 (yospaly 譯註: 即該標頭檔案本身已包含所有必要的顯式依賴), 最簡單的方法是將其作為第一個 .h 檔案 #included 進對應的 .cc.

  1. dir2/foo2.h (優先位置, 詳情如下)
  2. C 系統檔案
  3. C++ 系統檔案
  4. 其他庫的 .h 檔案 //該處在小專案之中往往只有一個專案,所以此處這時可省略
  5. 本專案內 .h 檔案

Ex:google-awesome-project/src/foo/internal/fooserver.cc 的包含次序如下:

#include "foo/public/fooserver.h" //

#include <sys/types.h>

#include <unistd.h>

#include <hash_map>

#include <vector>

#include "base/basictypes.h"

#include "base/commandlineflags.h"

#include "foo/public/bar.h"

總結:

1.避免多重包含

2.合理使用前置宣告,減少可能存在的額外編譯

3.合理使用行內函數,提高程式碼效率

4.根據自己的想法進行函式位置排序

5.合理編排檔案的標頭檔案排序