Coding standards ================ It is highly recommended to use a single *coding style* for the whole project source code. Exceptions are allowed for external libraries used in the project, but it is generally advisable all contributors to use this style. Tab Size -------- First of all, we use spaces. Tabs are four-character width. That is, no 8-space tabs, no 2-space tabs. Four. Unfortunately there's no such thing as 'standard tab width', and 4-space indenting looks best from our point of view, besides MSVC' editor has this setting by default. Line length ----------- Then, please use 80-character wide lines. If your line is way longer than that, please split it. If it's just a little longer, so be it. The continuation text, if you're splitting text inside the brackets, should be indented to the position after the opening bracket: printf("This is a example of how we split lines longer than %d characters\n" "into several so that they won't exceed this limit.\n", max_sourcecode_width); If you have long strings, you can split them as shown above, just remember that C/C++ compilers will glue together several strings that come without any special characters between them into one. Brackets -------- Now we use symmetric bracket placement, closing bracket under the opening bracket: if (something) { ...; } else { ...; } switch (x) { case 1: printf("X is one!\n"); break; case 2: { printf("X is two!\n"); break; } } for (int i = 1; i < 3; ++i) { printf("I is %i!\n", i); } Every bracketed block moves its contents by one tab to right. Labels (but not case selectors or 'public:/private:/protected' C++ keywords) are placed at the leftmost indention position for the current block, that is, in the same position where enclosing brackets are. Also please don't use brackets around a single statement because it clutters the code with unneeded stuff; use brackets only when using non-obvious constructs, like: if (...) { if (...) ...; } else ...; Also, please place one space before opening parenthesis. Before, but not after (the `if ( blah )` style is a no-no!). Class declaration and constructors ---------------------------------- Here is an example: class Class : public Parent { public: Class() : Parent(0), m_field(1) { func(); } void func() {} private: int m_field; }; Please follow the following rules for classes: * space before and after : in class parents list and constructor body * next line and indent for class field initialization list * indent for public:/private:/protected: section with additional indent for section content * empty or short function body can be at same line with declaration in in-class definition case Code documentation with Doxygen ------------------------------- Now, please use DoxyGen-type comments. This is a bit similar to JavaDoc comments and to other automatic code documentation generation tools. One-line documentation should be placed in `///` (three slashes) comments if the comment is above the function/member, if you want the comment on the same line you should use `///<` instead, multi-line comments should be put in a `/** ... */` block (slash-two-stars). Here's a example that shows most useful keywords that you can use in a comment block: /** * This function does something very useful. If used with care, this function * has the potential to make your programs really really useful. * * \arg \c x * The x argument specifies a integer that is transformed into something useful. * \arg \c y * This argument, if not NULL, is a pointer to a free memory area where this * function will put something really really useful. * \return * A useful value, or NULL if error. * * Here is a example that you can paste into your code so that it saves you a * lot of typing: * * \verb atim (Remove the space) * for (int x = 0; x < 100; ++x) * printf("DoSomethingUseful%d = %s\n", i, * DoSomethingUseful(i, &ScratchPad)); * \endve rbatim (Remove the space) * * Paragraphs are split from each other by inserting a empty line. Also some HTML * tags are supported, like
    [
  1. ...]
and for * ordered (numbered) and unordered (dotted) lists respectively. */ char *DoSomethingUseful(int x, void *y); /// This is a one-line comment void Something(); Use normal comments like `//` and `/* ... */` only if you want to make a comment that should not go into the automatically annotated code (like: `/* shit ... this does not work */`).