Skip to content
Snippets Groups Projects
codingStyleGuide.org 5.79 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
  • 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. Do not clutter up 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 label and scalar as copy, anything bigger 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 it’s 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)
  • splitting logical tests over several lines

    indent operator so that the next variable to test is aligned with the four space indentation, i.e.

    if ( a == true && b == c )