mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
- markup codingStyleGuide.org examples so they actually indent correctly - use 'Info<<' as per codingStyleGuide instead of 'Info <<'
7.1 KiB
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
)