| # 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. | |
| #### Tip: TODO comments | |
| When following the Google C++ style guide by entering a bug number in a TODO | |
| comment, using the form `TODO(fxbug.dev/11111)` will provide an address that | |
| can be used as a URL. | |
| ### 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 IDK 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-IDK 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/ui/scenic/bin/app.h" // Implementation header | |
| ``` | |
| * 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>`). |