blob: 8038072e7f3e741190eba3bd83dfc631a43ea226 [file] [log] [blame] [view]
# 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>`).