...
https://www.doxygen.nl/index.html
Bracket usage
When using brackets, always do
...
Code Block | ||||
---|---|---|---|---|
| ||||
enum class Color {
red,
blue
};
//NOT
enum Color {
red,
blue
}; |
using, not typedef
Use the using type alias rather than typedef:
Code Block | ||
---|---|---|
| ||
using distance_t = double; // define distance_t as an alias for type double
//NOT
typedef double distance_t; // define distance_t as an alias for type double |
const, not define
Avoid using #define to create symbolic constants macros.
Code Block | ||
---|---|---|
| ||
const double GRAVITY{ 9.8 }; // preferred use of const before type |
Naming conventions
Variables are camelCase.
Methods are camelCase.
Classes are PascalCase.
Static constants are UPPER_SNAKE_CASE.
Code Block | ||||
---|---|---|---|---|
| ||||
class EncodedPacket { public: EncodedPacket(uint8_t *data, uint8_t len); const uint8_t *getData() const; uint8_t getLen() const; DecodedPacket *decode(); private: const uint8_t * const data; const uint8_t len; Static const void print(){ std::cout << "This is a function!"; } }; |
Constants
Everything should be a constant reference if possible. By default, functions will make a copy of what is passed in, which we do not want.
Code Block | ||||
---|---|---|---|---|
| ||||
uint8_t const &dataRef = data;
//NOT
uint8_t dataRef = data; |
When initializing a function:
Code Block | ||||
---|---|---|---|---|
| ||||
EncodedPacket(uint8_t *dataRef); //NOT EncodedPacket(uint8_t dataRef); |
Constexpr, not Macros
Use constant expressions (constexpr) for small helper functions.
Code Block | ||
---|---|---|
| ||
constexpr int square(int x) { return x*x; }
//NOT
#define SQUARE(r) ((r)*(r))
double square_macro = AREA(4.6); |
Assertions
Occasionally use assert statements to double-check any condition. If the statement inside the assert is false, the program will terminate.
Code Block | ||||
---|---|---|---|---|
| ||||
bool value = 8;
assert(value != NULL);
assert(value == 5); //Program will terminate |