Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
# -*- 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
+ 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
)