4285
Comment:
|
4138
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
## page was renamed from CodingConventions/Formatting Back to CodingConventions. |
Back to [[ForDevelopers|developer page]]. |
Line 4: | Line 3: |
= Code formatting = | = C++ whitespace guide = |
Line 6: | Line 5: |
As with our other CodingConventions: when something is not specified here and you're in doubt, follow the examples in the existing code. | As with our other coding conventions: when something is not specified here and you're in doubt, follow the examples in the existing code. We'll extend this page on an as-needed basis. |
Line 8: | Line 7: |
We use {{{uncrustify}}} with a Fast Downward configuration file to enforce some of the formatting conventions. If a source file is properly formatted, applying {{{uncrustify}}} should be an idempotent operation (i.e., result in an identical file). This is important so that we can verify our style rules automatically, at least for those rules which {{{uncrustify}}} can handle. | Some of the conventions discussed on this page are automatically taken care of by {{{uncrustify}}} (see [[./Uncrustify]]), but not all of them. In particular, {{{uncrustify}}} will not break lines for you in most cases. |
Back to developer page.
C++ whitespace guide
As with our other coding conventions: when something is not specified here and you're in doubt, follow the examples in the existing code. We'll extend this page on an as-needed basis.
Some of the conventions discussed on this page are automatically taken care of by uncrustify (see ./Uncrustify), but not all of them. In particular, uncrustify will not break lines for you in most cases.
This page discusses aspects that are not handled by uncrustify and/or aspects that are unclear and need further explanation.
Basic style overview
We mostly follow the style from The C Programming Language (cf. "K&R style" on http://en.wikipedia.org/wiki/Indent_style). If you're an emacs user, setting your style to stroustrup should work fine.
Some points on which we differ from K&R or where K&R does not specify a rule:
- Line width is 72 characters if possible, 80 characters max.
- Indent with 4 spaces. There should be no tab characters in the file.
Don't put the opening brace of a block on a line of its own. (K&R style makes an exception to the usual brace rule for function definitions; we don't.)
For if, while statements etc. with only a single statement in the body, braces are optional. The single-line statement should always be on a new line. For constructs with several blocks (if/else, try/catch) either all blocks should have braces or none.
Examples of proper code (highlights brace style; spacing around statements, function calls and pointers/references; breaking lines):
1 const int *MyClass::my_method(int &x, const FooBar *foo_bar) const {
2 if (x < 0)
3 return &x;
4 foo_bar->dump();
5 if (x >= 0) {
6 x = foo_bar->get_value() + 4;
7 } else {
8 foo_bar->something_quite_long_with_lots_of_arguments(
9 x, x + 3, foo_bar, true);
10 cout << "Currently x has this value: " << x
11 << "; I hope this is alright." << endl;
12 }
13 return foo_bar->get_int_variable();
14 }
Breaking lines
Lines that are too long (more than 72 or 80 characters; see above) should be broken. Use "natural" places to break the lines; some rules follow. Don't use a continuation character (\) unless necessary.
Breaking function calls
Use one of these two ways to break function calls:
- Break after opening parenthesis, indent following lines by four spaces.
- Break after an argument, align after the opening parenthesis.
The first way is usually preferred.
Breaking stream output
Break lines before << or >> operators and align on these operators:
Breaking function definition heads
- Prefer to keep everything on one line.
- If this is too long, break as for function calls above.
- If this is still too long, break after the return value type.
1 void MyClass::everything_fits_on_one_line_here(double &x, int y) {
2 // Case 1 above.
3 }
4
5 int *MyLongerClassName::ooh_it_does_not_really_fit_any_more_here(
6 double &x, int y) {
7 // Case 2 above.
8 }
9
10 int *MyLongerClassName::ooh_it_does_not_really_fit_any_more_here(double &x,
11 int y) {
12 // Case 2 above, variant.
13 }
14
15 MyEvenQuiteAFewWordsLongerClassName::NestedClassWithALongName *
16 MyEvenQuiteAFewWordsLongerClassName::create_nested_class_with_a_long_name_instance(
17 double &x, int y) {
18 // Case 3 above.
19 }