blob: cb0d15ee54f49f35bfa9b7c89144fcfd8d3c1a4e [file] [log] [blame]
*** Patches not matching these rules will be rejected ***
First off, read Linus' CodingStyle in the kernel Documentation/ directory.
Most of it applies directly. There are a number of other points worth making,
however.
The script "check_style.py" in the oprofile-tests CVS module can help
identify some problems. Note that it generates a lot of false positives,
as well as false negatives, so be careful in its use. If all else fails,
use common sense.
General points
--------------
Keep lines within 80 columns with a maximum tab size of 8. You may
exceed 80 columns if the alternative is uglier (see format_output.h).
Keep files (especially headers) focussed on one small aspect.
Make judicious use of forward declarations.
Rationale: reduce false include dependencies
Separate out more general routines and place them in the appropriate
utility library (e.g. libop/, libutil++).
Rationale: re-use, clean organisation
Avoid complex conditionals via helper functions (e.g. comma_match)
Avoid ifdefs: prefer configure options / build trickery.
Use Doxygen comments judiciously. Actual source code should generally
only document the unexpected. Comments should not duplicate what the code
says (this means variable/function naming is uber-important). The Doxygen
function comments go in the header (except for static functions obviously).
Do not use trailing comments, unless they are used for an enum or struct
member, e.g. :
enum foo {
bar, /**< foo */
baz, /**< quux */
};
If you do this, you must use the above doxygenated markup.
Makefile.am: prefer using
LIST = \
foo1 \
foo2
rather than
LIST = foo1 foo2
Rationale: diffs are a lot easier to read.
Arbitrary rules
---------------
Two blank lines between functions.
Use tabs for indentation, spaces for alignment. Avoid wrapping lines,
but if you do, choose a reasonable point and align the next line
sensibly. If there is no sensible alignment point, use single extra
tab to indicate "continuation". Avoid using tabs for alignment: it
breaks on different sized tabs. Lines should be less than 80
on screen characters wide (assuming a maximum tab-size of 8).
rationale: http://www.movementarian.org/docs/whytabs/
C++ inline methods in headers. use Java braces :
void method() {
}
Avoid using inline methods at all.
Space types like this :
void blah(int * x, int * y);
void blah(int & x);
int & ref = get_ref();
int * x = &y;
int z = *x;
int arr[4];
Rationale: makes application of operators visually different from
type specifications.
Use "char const *" not "const char *".
Make use of the C++ standard library. That's what it's there for. Bear
in mind we support gcc 2.91.66
Avoid CamelCase in preference to cpp_std_library.
Use "using namespace std;" in .cpp files. Use std:: qualification in .h files.
Avoid do { } while(). Avoid defines.
Single-line for/while/if blocks should generally not use containing
braces. Never use the comma operator to avoid braces. If there is more
than one visual line (regardless of number of statements), you need
braces. If there is an else clause, you should probably use braces; if
any of the branches in an if/else if change has braces, they all should.
Spacing :
if (blah) {
call_method(&param);
x = y + z;
x = func(a, b, c + SOME_DEFINE);
Use noncopyable, scoped_ptr, and scoped_array.
Use the standard comments + include guards for headers.
Do not inline unless you have good reason.
Use anon namespaces for static variables.
In a derived class re-implementing a virtual function, include the
(unnecessary) "virtual" keyword in the function declaration.
"nr_doobries" not "no_doobries" - disambiguates between "number" and "negative"
Wrap long function definitions like this if possible :
struct some_frobnication const &
my_frobnicator(vector<string> const & values, bool bogo);
or, if not :
static void my_frobnicator(vector<string> const & values,
vector<string> const & things);
Note the spaces for alignment here. Avoid such long prototypes at all where sensible.