Newer
Older
# -*- mode: org; -*-
#
#+TITLE: OpenFOAM C++ style guide
#+AUTHOR: OpenCFD Ltd.
#+DATE: November 2009
#+LINK: http://www.opencfd.co.uk
#+OPTIONS: author:nil ^:{}
* 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.
<< is always four characters after the start of the stream,
so that the << symbols align, i.e.
#+BEGIN_EXAMPLE
Info<< ...
os << ...
#+END_EXAMPLE
WarningIn("className::functionName()")
<< "Warning message"
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
\*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*\
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()
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();
const className& variableName(otherClass.data());
+ virtual functions
If a class is virtual - make all derived classes virtual.
*** Conditional Statements
if (condition)
{
code;
}
if
(
long condition
)
{
code;
}
NOT (no space between "if" and "(")
if(condition)
{
code;
}
for (i = 0; i < maxI; i++)
{
code;
}
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
*** 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
const Foam::longReturnTypeName&
Foam::longClassName::longFunctionName const
const Foam::longReturnTypeName& Foam::longClassName::longFunctionName
const
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
);
variableName =
longClassName.longFunctionName(longArgument);
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.
* (k + t);
#+END_EXAMPLE
This is sometime more legible when surrounded by extra parentheses:
#+BEGIN_EXAMPLE
variableName =
(
a * (a + b)
- exp(c/d)
* (k + t)
);
#+END_EXAMPLE
+ 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
)