| # C++ style guide |
| |
| The Fuchsia project follows the public [Google C++ style guide][google-guide], with a |
| few exceptions. |
| |
| Using [clang-format][clang-format] is a good practice as it ensures your code is in |
| compliance with the style guide. Tricium checks in Gerrit also use clang-format as a |
| non-gating linter. However, you may still manually format code as long as it complies |
| with these guidelines. |
| |
| ### Exceptions |
| |
| #### Line length |
| |
| Fuchsia uses 100 columns instead of 80. |
| |
| #### Braces |
| |
| Always use braces `{ }` when the contents of a block are more than one line. |
| This is something you need to watch since Clang-format doesn't know to add |
| these. |
| |
| ```cpp |
| // Don't do this. |
| while (!done) |
| doSomethingWithAReallyLongLine( |
| wrapped_arg); |
| |
| // Correct. |
| while (!done) { |
| doSomethingWithAReallyLongLine( |
| wrapped_arg); |
| } |
| ``` |
| |
| |
| #### Conditionals and loops |
| |
| Do not use spaces inside parentheses (the Google style guide discourages but |
| permits this). |
| |
| Do not use the single-line form for short conditionals and loops (the Google |
| style guide permits both forms): |
| |
| ```cpp |
| // Don't do this: |
| if (x == kFoo) return new Foo(); |
| |
| // Correct. |
| if (x == kFoo) |
| return new Foo; |
| ``` |
| |
| #### Namespace names |
| |
| * Nested namespaces are forbidden, with the following exceptions: |
| - `internal` (when required to hide implementation details of templated code) |
| - code generated by the FIDL compiler |
| * The following top-level namespaces are forbidden: |
| - `internal` |
| - `fuchsia` (except in code generated by the FIDL compiler) |
| * Namespaces in SDK libraries must be kept to as short a list as possible. |
| A later document will provide an explicit list of allowed namespaces; in the |
| meantime, new namespaces should be introduced thoughtfully. |
| * Namespaces in non-SDK libraries should also be chosen so as to reduce the risk |
| of clashes. Very generic nouns (eg. `media`) are best avoided. |
| |
| Rationale: [Tip of the Week #130: Namespace Naming][totw-130] |
| |
| [clang-format]: https://clang.llvm.org/docs/ClangFormat.html |
| [google-guide]: https://google.github.io/styleguide/cppguide.html |
| [totw-130]: https://abseil.io/tips/130 |
| |
| #### Includes |
| |
| * If the header being included is a system, global, or library header (see |
| [Naming C/C++ objects](naming.md) for precise definitions), use |
| `<angle brackets>` and the complete name of the header. These headers are |
| considered "C library headers" for the purposes of the Google C++ Style |
| Guide: |
| |
| ```cpp |
| #include <zircon/syscalls.h> # System header |
| #include <fuchsia/io/cpp/fidl.h> # Global header |
| #include <lib/fdio/fd.h> # Library header |
| ``` |
| |
| * If the header being included is a implementation header, use `"quotes"` and |
| use the full path to the header from the root of the source tree. These |
| headers are considered "your project's headers" for the purposes of the |
| Google C++ Style Guide: |
| |
| ```cpp |
| #include "src/ledger/bin/filesystem/detached_path.h" |
| ``` |
| |
| * Third-party headers can be included using the root-relative path (e.g. |
| `#include "third_party/skia/include/core/SkPaint.h"`) or using their canonical header |
| names (e.g. `#include <gtest/gtest.h>`). |
| |
| 4. *Exception:* In `//zircon`, headers in the same target can use relative |
| paths (e.g., `#include "private.h"`). This exception exists because Zircon's |
| previous build system did not distinguish between public and private headers. |
| We might revise this rule if we start distinguishing public and private |
| headers in Zircon in the future. |