- Indent style is Allman (BSD) -like, ie. brace on the next line from a control statement, indented on the same level. In switch-case statements the cases are on the same indent level as the switch statement.
- Indents use 4 spaces instead of tabs. Indents on empty lines should not be kept.
- Class and struct names are in camelcase beginning with an uppercase letter. They should be nouns. For example
DebugRenderer
, FreeTypeLibrary
, Graphics
.
- Functions are likewise in upper-camelcase. For example
CreateComponent
, SetLinearRestThreshold
.
- Variables are in lower-camelcase. Member variables have an underscore appended. For example
numContacts
, randomSeed_
.
- Constants and enumerations are in uppercase. For example
Vector3::ZERO
or PASS_SHADOW
.
- Pointers and references append the * or & symbol to the type without a space in between. For example
Drawable*
drawable, Serializer&
dest.
- The macro
NULL
and 0 should not be used for null pointers, nullptr
is used instead.
override
is used wherever possible.
using
is used instead of typedef
in type declarations.
enum class
is not used because of legacy reasons.
- Class definitions proceed in the following order:
- public constructors and the destructor
- public virtual functions
- public non-virtual member functions
- public static functions
- public member variables
- public static variables
- repeat all of the above in order for protected definitions, and finally private
- Header files are commented using one-line comments beginning with /// to mark them for Doxygen.
- Inline functions are defined inside the class definitions where possible, without using the inline keyword.
It's recommended to follow C++ Core Guidelines (except items that contradict Urho legacy, e.g. ES.107, Enum.3, Enum.5)
Use this brief checklist to keep code style consistent among contributions and contributors:
- Prefer inplace member initialization to initializer lists.
- Prefer range-based
for
to old style for
unless index or iterator is used by itself.
- Avoid
auto
unless it increases code readability. More details here and here.
- Use
auto
for verbose, unknown or redundant types. Example: auto iter = variables.Find(name);
for (auto& variable : variables) { }
auto model = MakeShared<Model>(context_);
- Use
auto
instead of manual type deduction via decltype
and typename
.