GoogleCPP 編程規範-- 每天看點,多了也記不住,在實踐中改變自己的代碼風格吧!
Cpp檔案的命名是.cc而不是.cpp,這點不是很明白,為什麼不用cpp,而是用cc
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Scoping
1. 標頭檔#define 保護
每個標頭檔都應該有#define來防止多次被包含,定義應該是在工程目錄中的完整路徑,例如檔案 foo/src/bar/baz.h 在工程foo中應該用如下的方式來保護
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif //FOO_BAR_BAZ_H
標頭檔依賴
在前向聲明可以實現要求的時候,不要使用#include
當一個標頭檔被引用的時候,一個依賴關係就被建立了,當被包含的標頭檔被改變的時候,其他的檔案就要被重新編譯。所以要盡量避免#include的使用
使用者可以使用前向聲明來減少#include的使用,例如當你的標頭檔使用File類,但是不需要訪問它的聲明的時候,你就可以使用前向聲明而不是 #include “file/base/file.h”
那麼什麼時候在標頭檔中使用一個類Foo,卻不需要訪問它的定義呢
1. 聲明資料成員 Foo * 或者 Foo &
2. 我們可以用類型Foo聲明函數參數或者傳回值
3. 可以聲明一個靜態成員Foo,因為靜態成員的定義是在類的外部
但是如果類中有Foo類型的資料成員的時候,就要#include了
有時候使用指標成員而不是對象成員是有意義的,然後這使得程式可讀性和效能降低,所以如果僅僅為了使得少使用#include而強迫使用指標成員是不值得的
Note: 如果符號Foo的使用是在源檔案中,這個時候應該匯入Foo的定義,或者通過#include或者前向聲明。
內嵌函式
在代碼很小,少於10行的時候,可以使用內嵌函式
定義
你可以聲明一個函數為內聯,使得編譯器在調用函數的位置展開他們,而不是採用一般的函數調用機制
支援的做法
內聯可以提高目標代碼效率,所以小函數盡量使用內聯,例如set get方法或者其他的對效率要求比較高的代碼
不支援的做法
如果代碼大於10行,就不要使用內聯了。注意解構函式,因為隱式成員函數和基類析構的調用使得他們的代碼通常要大於10行。
迴圈和switch存在的函數不要使用內聯
有些時候儘管有內聯聲明,但是函數卻未必內聯。例如虛函數,遞迴。通常虛函數的作用是在類中佔一個定義,而不是出於方便或者實現它的行為。
-inl.h檔案
當需要的時候,可以使用inl.h檔案來定義複雜的內嵌函式
短的內嵌函式,可以在.h中直接定義,例如get set方法。如果代碼比較長的的時候,又不想把內嵌函式的定義放在.cc檔案中,可以使用-inl.h檔案來定義內嵌函式,這使得內聯實現和類實現分來,同時允許實現在需要的地方包含進來。
-inl.h另一個用途是定義模板,它使得模板定義容易讀懂,和普通的.h一樣,使用#define guard
函數參數的排序
參數排序的方式為:輸入,輸出
c/c++參數要麼是輸入,要麼是輸出,或者既是輸入又是輸出(例如指標,引用)。輸入參數經常是值或者常引用,輸出是非常量的指標。聲明參數的時候,輸入參數在前,不要圖方便在後面加參數,確保輸入參數在前面。
Includes 的名字和排序
使用標準的排序保證可讀性,同時避免隱藏的依賴:C庫,C++庫,其他庫,自訂的.h
對於.cc檔案而言,例如foo2.cc
1. Dir2/foo2.h
2. C 系統庫
3. Cpp庫
4. 其他庫
5. 工程其他.h
例如
#include “foo/public/foosever.h” //對應的.h
#include <sys/types.h> //C庫
#include <unistd.h>
#include<hash_map> //C++庫
#include<vector>
#include “base/basictypes.h” //其他的工程.h
#include “base/commandlineflags.h”
#include “foo/public/bar.h”