Google 開源專案廣泛採用 C++,但其強大特性伴隨著高複雜度,易導致 Bug 滋生、難以閱讀維護。本指南旨在透過具體編碼規範,在保留語言表達力的前提下,提升程式碼可管理性。核心哲學有二:
#define 守衛所有 .h 必須有防重複包含巨集,命名格式:<PROJECT>_<PATH>_<FILE>_H_,確保全域唯一性。範例:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
// ... 內容
#endif // FOO_BAR_BAZ_H_
原則:能用前置宣告(class Foo;)就別 #include "foo.h"。包含標頭檔會引入編譯相依,任何變更皆觸發連鎖重編譯。
Foo*, Foo&)Foo 且僅宣告不定義Foo(定義在類別外部)Foo(子類別)Foo 型別非靜態資料成員(需知大小/佈局)權衡:為減少包含而改用指標成員(如 scoped_ptr)會犧牲可讀性與效率,若僅為少包含標頭則不划算。.cc 檔無論如何都需完整定義,故包含標頭無妨。
inline。switch 的函式(除非極少執行)、解構函式(隱含基類/成員解構常超過 10 行)。-inl.h 檔案:複雜內聯的歸宿-inl.h(如 foo-inl.h),而非汙染主標頭檔。#define 守衛。標準順序:
.h(最優先,確保獨立編譯)<stdio.h> 等)<vector> 等)./ ../)// 範例:foo/internal/fooserver.cc
#include "foo/public/fooserver.h" // 對應標頭優先
#include
#include
#include
#include
#include "base/basictypes.h"
#include "base/commandlineflags.h"
#include "foo/public/bar.h"
同目錄標頭按字母序排列。此規範確保每個標頭檔可獨立編譯,內部錯誤優先暴露。
標頭檔規範的核心在於控制編譯相依與保護命名空間純淨。前置宣告、內聯節制、參數順序、包含順序,皆是為了讓大型專案的建置系統保持高效、穩定、可預測。