C++ 樣式指南

Fuchsia 專案遵循公開的 Google C++ 樣式指南,但有些例外。

使用 clang-format 是很好的做法,因為這樣可以確保您的程式碼符合樣式指南。Gerrit 中的 Tricium 檢查也會使用 clang- 格式做為非閘道的 Linter。不過,只要符合這些規範,您仍可以手動方式設定程式碼格式。

紫紅色樣式

TODO 註解

Google C++ 樣式指南必須在 TODO 註解中參照錯誤編號。在 Fuchsia 中,系統會以 TODO(https://fxbug.dev/42074368) 格式完成這項操作。

編譯旗標

請勿新增 -Wall-Wextra

source_set("my_sources") {
  ...
  cflags = [
    # Don't do this!
    "-Wall",
  ]
}

這個旗標已經在建構作業中的集中位置新增,後面接著會全面隱藏特定警告的其他旗標。

有時會在上游新增編譯器警告。為了推送最新的編譯器,全域維護人員可以選擇集中暫時隱藏新推出的警告,並處理整個程式碼集修正這則警告例項的待處理問題。如果專案使用 -Wall,可能會因為 Clang 滾動而中斷。

您可隨意啟用/停用尚未全域的特定警告。 如果之後在全球設定這些警告時,方式必須與您的偏好設定一致,建議您移除所有本機覆寫設定。

source_set("my_sources") {
  ...
  cflags = [
    # We don't want any write-only params/vars in our code.
    # TODO(https://fxbug.dev/42133916): delete the below when these warnings are
    # enabled globally.
    "-Wunused-but-set-parameter",
    "-Wunused-but-set-variable",
  ]
}

例外狀況

文行長度

Fuchsia 使用 100 欄而非 80 欄。

大括號

如果區塊的內容超過一行,請一律使用大括號 { }。由於 Clang-format 不知道新增這些格式,因此您需要觀看上述內容。

// Don't do this.
while (!done)
  doSomethingWithAReallyLongLine(
       wrapped_arg);

// Correct.
while (!done) {
  doSomethingWithAReallyLongLine(
       wrapped_arg);
}

條件和迴圈

請勿在括號內使用空格 (Google 樣式指南不建議使用,但允許這種做法)。

請勿使用單行表單來處理短期的條件和迴圈 (Google 樣式指南允許這兩種形式):

// Don't do this:
if (x == kFoo) return new Foo();

// Correct.
if (x == kFoo) {
  return new Foo;
}

命名空間名稱

  • 禁止使用巢狀命名空間,但有以下例外:
    • internal (需要隱藏範本程式碼的實作詳細資料時)
    • 由 FIDL 編譯器產生的程式碼
  • 禁止使用下列頂層命名空間:
    • internal
    • fuchsia (FIDL 編譯器產生的程式碼除外)
  • IDK 程式庫中的命名空間必須盡可能保持精簡,後續文件將提供一份明確的清單,列出允許使用的命名空間;在此同時,則應審慎導入新的命名空間。
  • 另外,也應選擇非 IDK 程式庫中的命名空間,以降低衝突風險。過於籠統的名詞 (例如media) 值。

原因:第 130 週的提示:命名空間命名

包含

  • 如果包含的標頭是系統、全域或程式庫標頭 (請參閱為 C/C++ 物件命名以取得精確定義),請使用 <angle brackets> 和標頭的完整名稱。就 Google C++ 樣式指南而言,這些標頭會被視為「C 程式庫標頭」:

    #include <zircon/syscalls.h>           // System header
    #include <fuchsia/io/cpp/fidl.h>       // Global header
    #include <lib/fdio/fd.h>               // Library header
    
  • 如果內含的標頭是實作標頭,請使用 "quotes",並使用來源樹狀結構根層級標頭的完整路徑。就《Google C++ 樣式指南》而言,這些標頭屬於「您的專案標頭」:

    #include "src/ui/scenic/bin/app.h"     // Implementation header
    
  • 您可以使用根相關路徑 (例如 #include "third_party/skia/include/core/SkPaint.h") 或標準標頭名稱 (例如 #include <gtest/gtest.h>) 加入第三方標頭。