Project

General

Profile

Guidelines for API documentation » History » Version 12

neels, 10/23/2017 10:38 PM

1 1 neels
h1. Guidelines for API documentation
2
3 12 neels
Find the current API doc in HTML form here: http://ftp.osmocom.org/api/latest/
4
5 1 neels
We use doxygen for API documentation, following these guidelines:
6
7
Use the @/*!@ (Qt-style) doxygen markers.
8
9
Since we are using the AUTOBRIEF feature, always end the first sentence with a full-stop "." to mark the end of the short description.
10
This allows omitting the @\brief@ markers everywhere.
11
12
Never rely on line breaks as semantic separation or to end a sentence, always use proper punctuation. The API doc may be rendered with different line breaks than in the source file.
13
14 4 neels
h2. Locations
15
16
Header files usually contain merely function declarations bare of any API docs. The API doc comment should be in a @.c@ file at the definition of a function.
17
18
Structs and enums defined in a header file, though, also have their API doc comments in that @.h@ file.
19
20 10 neels
Comments for single-line items like enum values or struct members can be placed on the same line using @/*!< Description */@.
21
22 4 neels
h2. Grammar
23
24
Always use the imperative form, i.e. omit wording like "This function does", and avoid writing documentation that merely mirrors a function's name. For example:
25
26
<pre>
27
/*! Return a (static) buffer containing a hexdump of the msg.
28
 * \param[in] msg message buffer
29
 * \returns a pointer to a static char array
30
 */
31
const char *msgb_hexdump(const struct msgb *msg)
32
{
33
...
34
</pre>
35
36
h2. Parameters
37 1 neels
38 12 neels
All parameters of a function should be documented. Input params are documented with @\param[in]@, where out-parameters (pointers to which returned data is written) are documented with @\param[out]@. Rarely, a param is both: @\param[in,out]@.
39 4 neels
40
<pre>
41
/*! Apply nifty algorithm.
42
 * \param[in] x0  First factor.
43
 * \param[in] n   Amount of values to calculate.
44
 * \param[out] buf  Write calculated values to this buffer.
45
 *
46
 * Optional longer function description. */
47 1 neels
</pre>
48 7 neels
49 8 neels
It is also possible to document parameters without a direction, using merely @\param param_name Description@, however, it is desirable to always indicate @[in]@, @[out]@ or @[inout]@.
50 4 neels
51 1 neels
h2. File comments
52
53
If a file contains a descriptive comment, this comment should be right at the start of the file, as a doxygen @\file@ section.
54
The first sentence must be ended by a full stop "." to mark the end of the short description.
55
The copyright notice shall not be part of such API doc file comment.
56
57
<pre>
58
/*! \file foo.c
59
 * Short description. */
60
/*
61
 * (C) 2017 ... Copyright not in a doxygen comment
62
 * license information
63
 */
64
</pre>
65
66
or
67
68
<pre>
69
/*! \file foo.c
70
 * Short description.
71
 *
72
 * More information in multiple lines.
73
 */
74
/*
75
 * (C) 2017 ...
76
 */
77
</pre>
78
79 11 neels
If a file needs no description, it is ok to omit the @\file@ tag entirely. Since we are using EXTRACT_ALL = YES, files lacking a @\file@ tag are still listed in the API docs.
80 9 neels
81 1 neels
h2. Groups
82
83
Doxygen allows grouping elements: a group can include code elements and also entire files.
84
85
This works by enclosing the items to be grouped between an opening and a closing marker:
86
87
* A @\defgroup@ initially defines a group, this shall exist only once.
88
* More items can be added using an @\addtogroup@ marker.
89
* Both have to be closed by "@}".
90
91
For example:
92
93
<pre>
94
/*! \defgroup groupname Short description of the group.
95
 * @{
96
 */
97
98
struct type_that_belongs_to_group {
99
 ...
100
};
101
102
void func_that_belongs_to_group()
103
{
104
 ...
105
}
106
107
/*! @} */
108
</pre>
109
110
and 
111
112
<pre>
113
/*! \addtogroup groupname
114
 * @{
115
 */
116
117 3 neels
...
118 1 neels
119
/*! @} */
120
</pre>
121
122 5 neels
If a *file* should be added to a group, add a (possibly second) short descriptionless @\file@ tag to the group start. To clearly mark that the purpose is to add to the group, do so within the same comment block:
123 1 neels
124
<pre>
125
/*! \file foo.c
126 2 neels
 * File's description. */
127 1 neels
/*
128
 * (C) ...
129
 */
130
131
/*! \addtogroup groupname
132
 * @{
133
 * \file foo.c */
134
135
...
136
137
/*! @} */
138
</pre>
139
140
The point is that we like to have a file's short description near the start of the file, to also serve us well when we're reading only the .h file. But to be included in a group, the doxygen group start must precede the @\file@ tag. Also, the doxygen group should rather not enclose @#include@ directives, to clearly exclude those from the group. Hence, the best way is to keep the file's actual description at the top of the file, and add a second descriptionless @\file@ with the group opening.
141
142
A group may contain a short as well as a longer description. We often @\defgroup@ in a @.h@ file but keep the longer description in an @\addtogroup@ in a @.c@ file. Any @\file@ tags must follow *after* such description, or the description will be associated with the file instead of the group:
143
144
@.h@ file:
145
<pre>
146
/*! \defgroup groupname Short description of the group.
147
 * @{
148
 */
149
150
...
151
152
/*! @} */
153
</pre>
154
155
@.c file:
156
157
<pre>
158
/*! \addtogroup groupname
159
 * @{
160
 * Longer description of the group.
161
 * - contains a
162
 * - bullet list
163
 * 
164
 * As well as a 
165
 *
166
 *     Code example
167
 *     block
168
 *
169 6 neels
 * All of which must not be below the directive adding this file to the group...
170 1 neels
 *
171
 * \file foo.c */
172
173
[...]
174
175
/*! @} */
176
</pre>
177
178
Often, a file's description matches or is identical with a group's description. In that case, the file's description header comment can be omitted to avoid duplicating identical descriptions.
179
180
<pre>
181
/*
182
 * (C) 2017 ...
183
 */
184
185
/* \addtogroup group
186
 * @{
187
 * Description...
188
 *
189
 * \file foo.c */
190
191
...
192
193
/* @} */
194
</pre>
Add picture from clipboard (Maximum size: 48.8 MB)