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:

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:

  1. Break after opening parenthesis, indent following lines by four spaces.
  2. Break after an argument, align after the opening parenthesis.

The first way is usually preferred.

   1     int foobar1 = example_of_breaking_after_parenthesis(
   2         some_argument, foo + bar, baz, final_argument);
   3     int foobar2 = example_of_breaking_after_argument(some_argument, foo + bar,
   4                                                      baz, final_argument);

Breaking stream output

Break lines before << or >> operators and align on these operators:

   1     cout << "here's a lot of introductory text to make this a long line; x = " << x
   2          << ", y = " << y << endl;

Breaking function definition heads

  1. Prefer to keep everything on one line.
  2. If this is too long, break as for function calls above.
  3. 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 }

FastDownward: ForDevelopers/Whitespace (last edited 2010-11-15 18:26:04 by MalteHelmert)