C++ 样式指南

Fuchsia 项目遵循公开的 Google C++ 样式指南, 一些例外情况。

使用 clang-format 是一种很好的做法,因为它可以确保您的代码 风格指南Gerrit 中的 Tricium 检查也使用 Clang 格式作为 非门控 linter。不过,您仍可以手动设置代码格式,前提是它们符合 。

紫红色特有样式

TODO 注释

Google C++ 样式指南要求在 TODO 注释中引用 bug 编号。 在 Fuchsia 上,请按以下格式完成此操作:TODO(https://fxbug.dev/42074368)

编译标记

请勿添加 -Wall-Wextra

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

该标志已添加到 build 中的集中位置,后跟 附加标志,用于全局抑制某些警告。

偶尔会向上游添加新的编译器警告。为了将 最新编译器,全局维护人员可能会选择暂时抑制 当我们处理积压任务时,可以在一个位置集中显示新引入的警告 修复此警告的实例的步骤。如果您的项目 使用 -Wall,则可能会因 Clang Roll 而中断。

您可以随意启用/停用并非全局设置的特定警告。 如果稍后以符合规范的方式在全局范围内设置这些警告 自己的偏好设置,那么最好删除所有本地替换项。

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 格式不知道要添加 这些。

// 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;
}

命名空间名称

  • 禁止使用嵌套命名空间,但以下情况除外: <ph type="x-smartling-placeholder">
      </ph>
    • internal(需要隐藏模板化代码的实现详情时)
    • 由 FIDL 编译器生成的
  • 禁止使用以下顶级命名空间: <ph type="x-smartling-placeholder">
      </ph>
    • internal
    • fuchsia(FIDL 编译器生成的代码除外)
  • IDK 库中的命名空间必须保持尽可能短的列表。 稍后的文档将明确列出允许的命名空间;在 同时,也应谨慎引入新的命名空间。
  • 还应当选择非 IDK 库中的命名空间,以降低风险 冲突。非常通用的名词(例如media)。

依据:本周提示 #130:命名空间命名

包含

  • 如果包含的头文件是系统头文件、全局头文件或库头文件(请参阅 为 C/C++ 对象命名以获得准确的定义),请使用 <angle brackets> 以及标头的完整名称。这些标头分别是 被视为“C 库头文件”Google 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>)。