Files
openfoam/doc/codingStyleGuide.org
Mark Olesen fa93ce8cd7 coding style adherence
- markup codingStyleGuide.org examples so they actually indent correctly

- use 'Info<<' as per codingStyleGuide instead of 'Info <<'
2009-11-27 15:39:14 +01:00

7.1 KiB

OpenFOAM C++ style guide

#

OpenFOAM C++ style guide

General

  • 80 character lines max
  • The body of control statements (eg, if, else, while, etc). always delineated with brace brackets
  • Use spaces for indentation, not tab characters.
  • The normal indentation is 4 spaces per logical level.
  • Avoid trailing whitespace.
  • stream output << is always four characters after the start of the stream, so that the << symbols align, i.e.
      Info<< ...
      os  << ...

so

      WarningIn("className::functionName()")
          << "Warning message"

NOT

      WarningIn("className::functionName()")
      << "Warning message"
  • no unnecessary class section headers, i.e. remove
      // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //

      // Check

      // Edit

      // Write

if they contain nothing, even if planned for 'future use'

  • class titles are centred
     /*---------------------------------------------------------------------------*\
                             Class exampleClass Declaration
     \*---------------------------------------------------------------------------*/

NOT

     /*---------------------------------------------------------------------------*\
                    Class exampleClass Declaration
     \*---------------------------------------------------------------------------*/

.H Files

  • header file spacing Leave two empty lines between sections (as per functions in the .C file etc)
  • use "//- Comment" comments in header file

    • add descriptions to class data and functions
  • destructor If adding a comment to the destructor - use //- and code as a normal function:
      //- Destructor
      ~className();
  • inline functions Use inline functions where appropriate in a separate classNameI.H file. Avoid cluttering the header file with function bodies.

.C Files

  • Do not open/close namespaces in a .C file Fully scope the function name, i.e.
      Foam::returnType Foam::className::functionName()

NOT

      namespace Foam
      {
          ...

          returnType className::functionName()

          ...
      }

EXCEPTION

When there are multiple levels of namespace, they may be used in the .C file, i.e.

      namespace Foam
      {
      namespace compressible
      {
      namespace RASModels
      {

          ...

      } // End namespace RASModels
      } // End namespace compressible
      } // End namespace Foam
  • Use two empty lines between functions

Coding Practise

  • passing data as arguments or return Pass bool, label and scalar as copy, anything larger by reference.
  • const Use everywhere it is applicable.
  • variable initialisation using "="
      const className& variableName = otherClass.data();

NOT

      const className& variableName(otherClass.data());
  • virtual functions If a class is virtual - make all derived classes virtual.

Conditional Statements

    if (condition)
    {
        code;
    }

OR

    if
    (
       long condition
    )
    {
        code;
    }

NOT (no space between "if" and "(")

    if(condition)
    {
        code;
    }

`for' Loops

    for (i = 0; i < maxI; i++)
    {
        code;
    }

OR

    for
    (
        i = 0;
        i < maxI;
        i++
    )
    {
        code;
    }

NOT (no space between "for" and "(")

    for(i = 0; i < maxI; i++)
    {
        code;
    }

`forAll' loops

like for loops, but

    forAll(

NOT

    forAll (

Splitting Over Multiple Lines

  • splitting return type and function name

    • split initially after the function return type and left align
    • do not put "const" onto its own line - use a split to keep it with the function name and arguments.

    so:

     const Foam::longReturnTypeName&
     Foam::longClassName::longFunctionName const

NOT

     const Foam::longReturnTypeName&
         Foam::longClassName::longFunctionName const

NOR

     const Foam::longReturnTypeName& Foam::longClassName::longFunctionName
     const

NOR

     const Foam::longReturnTypeName& Foam::longClassName::
     longFunctionName const
  • if need to split again, split at the function name (leaving behind the preceding scoping "::"s), and again, left align, i.e.
       const Foam::longReturnTypeName&
       Foam::veryveryveryverylongClassName::
       veryveryveryverylongFunctionName const
  • splitting long lines at an "=" Indent after split
     variableName =
         longClassName.longFunctionName(longArgument);

OR (where necessary)

     variableName =
         longClassName.longFunctionName
         (
             longArgument1,
             longArgument2
         );

NOT

     variableName =
     longClassName.longFunctionName(longArgument);

NOR

     variableName = longClassName.longFunctionName
     (
         longArgument1,
         longArgument2
     );

Maths and Logic

  • operator spacing

    • a + b, a - b
    • a*b, a/b
    • a & b, a ^ b
    • a = b, a != b
    • a < b, a > b, a >= b, a <= b
    • a || b, a && b
  • splitting formulae over several lines Split and indent as per "splitting long lines at an "="" with the operator on the lower line. Align operator so that first variable, function or bracket on the next line is 4 spaces indented i.e.
      variableName =
          a * (a + b)
        - exp(c/d)
        * (k + t);

This is sometime more legible when surrounded by extra parentheses:

      variableName =
      (
          a * (a + b)
        - exp(c/d)
        * (k + t)
      );
  • splitting logical tests over several lines outdent the operator so that the next variable to test is aligned with the four space indentation, i.e.
      if
      (
          a == true
       && b == c
      )