為了增強可讀性、避免隱含依賴,Google 規定:
foo/internal/fooserver.cc 先包含 foo/public/fooserver.h)——確保頭文件自給自足,無隱藏依賴。<stdio.h>, <stdlib.h> 等<vector>, <string>, <algorithm> 等<boost/...>, <gtest/gtest.h> 等"base/basictypes.h", "foo/public/bar.h" 等// A.h
struct BS bs; // 依賴 B.h 中的 BS 定義
// B.h
struct BS { ... };
// A.cpp 錯誤順序
#include "A.h"
#include "B.h" // 編譯報錯:A.h 見不到 BS 定義
// 正確順序(或在 A.h 內包含 B.h)
#include "B.h"
#include "A.h"
將自身頭文件放第一位,能強制暴露隱藏依賴,倒逼頭文件自包含所需依賴。
外部引用專案頭文件時必須帶上專案目錄前綴:
#include "base/logging.h" ✅
#include "logging.h" ❌(易發生同名衝突)
除首選頭文件外,順序遵循「通用 → 專用」原則。更精確的層級劃分應為:
OS SDK → C 標準庫 → C++ 標準庫 → 第三方庫 → 本專案庫
(如 sys/types.h 屬於 OS SDK 而非 C 標準庫)
規範頭文件順序不僅是風格統一,更是為了編譯期防火牆:減少隱藏耦合,確保頭文件獨立可編譯,提升構建可靠性與並行編譯效率。