| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 90a5e9f commit d3e76e7
1 file changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2,28 +2,33 @@ | |||
| 2 | 2 | ||
| 3 | 3 | ## Table of Contents | |
| 4 | 4 | ||
| 5 | - * [Left-leaning (C++ style) asterisks for pointer declarations](#left-leaning-c-style-asterisks-for-pointer-declarations) | ||
| 6 | - * [2 spaces of indentation for blocks or bodies of conditionals](#2-spaces-of-indentation-for-blocks-or-bodies-of-conditionals) | ||
| 7 | - * [4 spaces of indentation for statement continuations](#4-spaces-of-indentation-for-statement-continuations) | ||
| 8 | - * [Align function arguments vertically](#align-function-arguments-vertically) | ||
| 9 | - * [Initialization lists](#initialization-lists) | ||
| 10 | - * [CamelCase for methods, functions, and classes](#camelcase-for-methods-functions-and-classes) | ||
| 11 | - * [snake\_case for local variables and parameters](#snake_case-for-local-variables-and-parameters) | ||
| 12 | - * [snake\_case\_ for private class fields](#snake_case_-for-private-class-fields) | ||
| 13 | - * [Space after `template`](#space-after-template) | ||
| 14 | - * [Type casting](#type-casting) | ||
| 15 | - * [Memory allocation](#memory-allocation) | ||
| 16 | - * [`nullptr` instead of `NULL` or `0`](#nullptr-instead-of-null-or-0) | ||
| 17 | - * [Do not include `*.h` if `*-inl.h` has already been included](#do-not-include-h-if--inlh-has-already-been-included) | ||
| 18 | - * [Avoid throwing JavaScript errors in nested C++ methods](#avoid-throwing-javascript-errors-in-nested-c-methods) | ||
| 19 | - * [Ownership and Smart Pointers](#ownership-and-smart-pointers) | ||
| 5 | + * [Formatting](#formatting) | ||
| 6 | + * [Left-leaning (C++ style) asterisks for pointer declarations](#left-leaning-c-style-asterisks-for-pointer-declarations) | ||
| 7 | + * [2 spaces of indentation for blocks or bodies of conditionals](#2-spaces-of-indentation-for-blocks-or-bodies-of-conditionals) | ||
| 8 | + * [4 spaces of indentation for statement continuations](#4-spaces-of-indentation-for-statement-continuations) | ||
| 9 | + * [Align function arguments vertically](#align-function-arguments-vertically) | ||
| 10 | + * [Initialization lists](#initialization-lists) | ||
| 11 | + * [CamelCase for methods, functions and classes](#camelcase-for-methods-functions-and-classes) | ||
| 12 | + * [snake\_case for local variables and parameters](#snake_case-for-local-variables-and-parameters) | ||
| 13 | + * [snake\_case\_ for private class fields](#snake_case_-for-private-class-fields) | ||
| 14 | + * [Space after `template`](#space-after-template) | ||
| 15 | + * [Memory Management](#memory-management) | ||
| 16 | + * [Memory allocation](#memory-allocation) | ||
| 17 | + * [Use `nullptr` instead of `NULL` or `0`](#use-nullptr-instead-of-null-or-0) | ||
| 18 | + * [Ownership and Smart Pointers](#ownership-and-smart-pointers) | ||
| 19 | + * [Others](#others) | ||
| 20 | + * [Type casting](#type-casting) | ||
| 21 | + * [Do not include `*.h` if `*-inl.h` has already been included](#do-not-include-h-if--inlh-has-already-been-included) | ||
| 22 | + * [Avoid throwing JavaScript errors in nested C++ methods](#avoid-throwing-javascript-errors-in-nested-c-methods) | ||
| 20 | 23 | ||
| 21 | 24 | Unfortunately, the C++ linter (based on | |
| 22 | 25 | [Google’s `cpplint`](https://github.com/google/styleguide)), which can be run | |
| 23 | 26 | explicitly via `make lint-cpp`, does not currently catch a lot of rules that are | |
| 24 | 27 | specific to the Node.js C++ code base. This document explains the most common of | |
| 25 | 28 | these rules: | |
| 26 | 29 | ||
| 30 | + ## Formatting | ||
| 31 | + | ||
| 27 | 32 | ## Left-leaning (C++ style) asterisks for pointer declarations | |
| 28 | 33 | ||
| 29 | 34 | `char* buffer;` instead of `char *buffer;` | |
@@ -128,23 +133,50 @@ class FancyContainer { | |||
| 128 | 133 | ... | |
| 129 | 134 | } | |
| 130 | 135 | ``` | |
| 131 | - | ||
| 132 | - ## Type casting | ||
| 133 | - | ||
| 134 | - - Always avoid C-style casts (`(type)value`) | ||
| 135 | - - `dynamic_cast` does not work because RTTI is not enabled | ||
| 136 | - - Use `static_cast` for casting whenever it works | ||
| 137 | - - `reinterpret_cast` is okay if `static_cast` is not appropriate | ||
| 136 | + ## Memory Management | ||
| 138 | 137 | ||
| 139 | 138 | ## Memory allocation | |
| 140 | 139 | ||
| 141 | 140 | - `Malloc()`, `Calloc()`, etc. from `util.h` abort in Out-of-Memory situations | |
| 142 | 141 | - `UncheckedMalloc()`, etc. return `nullptr` in OOM situations | |
| 143 | 142 | ||
| 144 | - ## `nullptr` instead of `NULL` or `0` | ||
| 143 | + ## Use `nullptr` instead of `NULL` or `0` | ||
| 145 | 144 | ||
| 146 | 145 | What it says in the title. | |
| 147 | 146 | ||
| 147 | + ## Ownership and Smart Pointers | ||
| 148 | + | ||
| 149 | + "Smart" pointers are classes that act like pointers, e.g. | ||
| 150 | + by overloading the `*` and `->` operators. Some smart pointer types can be | ||
| 151 | + used to automate ownership bookkeeping, to ensure these responsibilities are | ||
| 152 | + met. `std::unique_ptr` is a smart pointer type introduced in C++11, which | ||
| 153 | + expresses exclusive ownership of a dynamically allocated object; the object | ||
| 154 | + is deleted when the `std::unique_ptr` goes out of scope. It cannot be | ||
| 155 | + copied, but can be moved to represent ownership transfer. | ||
| 156 | + `std::shared_ptr` is a smart pointer type that expresses shared ownership of a | ||
| 157 | + dynamically allocated object. `std::shared_ptr`s can be copied; ownership | ||
| 158 | + of the object is shared among all copies, and the object | ||
| 159 | + is deleted when the last `std::shared_ptr` is destroyed. | ||
| 160 | + | ||
| 161 | + Prefer to use `std::unique_ptr` to make ownership | ||
| 162 | + transfer explicit. For example: | ||
| 163 | + | ||
| 164 | + ```cpp | ||
| 165 | + std::unique_ptr<Foo> FooFactory(); | ||
| 166 | + void FooConsumer(std::unique_ptr<Foo> ptr); | ||
| 167 | + ``` | ||
| 168 | + | ||
| 169 | + Never use `std::auto_ptr`. Instead, use `std::unique_ptr`. | ||
| 170 | + | ||
| 171 | + ## Others | ||
| 172 | + | ||
| 173 | + ## Type casting | ||
| 174 | + | ||
| 175 | + - Always avoid C-style casts (`(type)value`) | ||
| 176 | + - `dynamic_cast` does not work because RTTI is not enabled | ||
| 177 | + - Use `static_cast` for casting whenever it works | ||
| 178 | + - `reinterpret_cast` is okay if `static_cast` is not appropriate | ||
| 179 | + | ||
| 148 | 180 | ## Do not include `*.h` if `*-inl.h` has already been included | |
| 149 | 181 | ||
| 150 | 182 | Do | |
@@ -169,27 +201,3 @@ A lot of code inside Node.js is written so that typechecking etc. is performed | |||
| 169 | 201 | in JavaScript. | |
| 170 | 202 | ||
| 171 | 203 | Using C++ `throw` is not allowed. | |
| 172 | - | ||
| 173 | - ## Ownership and Smart Pointers | ||
| 174 | - | ||
| 175 | - "Smart" pointers are classes that act like pointers, e.g. | ||
| 176 | - by overloading the `*` and `->` operators. Some smart pointer types can be | ||
| 177 | - used to automate ownership bookkeeping, to ensure these responsibilities are | ||
| 178 | - met. `std::unique_ptr` is a smart pointer type introduced in C++11, which | ||
| 179 | - expresses exclusive ownership of a dynamically allocated object; the object | ||
| 180 | - is deleted when the `std::unique_ptr` goes out of scope. It cannot be | ||
| 181 | - copied, but can be moved to represent ownership transfer. | ||
| 182 | - `std::shared_ptr` is a smart pointer type that expresses shared ownership of a | ||
| 183 | - dynamically allocated object. `std::shared_ptr`s can be copied; ownership | ||
| 184 | - of the object is shared among all copies, and the object | ||
| 185 | - is deleted when the last `std::shared_ptr` is destroyed. | ||
| 186 | - | ||
| 187 | - Prefer to use `std::unique_ptr` to make ownership | ||
| 188 | - transfer explicit. For example: | ||
| 189 | - | ||
| 190 | - ```cpp | ||
| 191 | - std::unique_ptr<Foo> FooFactory(); | ||
| 192 | - void FooConsumer(std::unique_ptr<Foo> ptr); | ||
| 193 | - ``` | ||
| 194 | - | ||
| 195 | - Never use `std::auto_ptr`. Instead, use `std::unique_ptr`. | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments