Document the code
OpenTwin uses Doxygen to generate the Code. There are many ways to document the code by following the Doxygen style guide. Here we have listed a guide that OpenTwin agreed on to use for all of the files in the OpenTwin projects.
The ‘//!’ prefix should be used to indicate a Doxygen comment.
The advantage the ‘//!’ prefix is that a code block containing multiple methods or blocks of Doxygen comments can be easily commented out by using /* ... */
.
To address a Doxygen keyword use the \
prefix.
Detailed descriptions can be added without a keyword in the lines after the \brief
.
Classes
Every class should have a \brief
set.
The class keyword is used to create references in the documentation.
The brief should contain a short text description of the class which is a single
line.
//! \class MyClass
//! \brief The MyClass is used to store two integers.
//! Here a more detailed description could be added
//! which may span over multiple lines and also contain
//! #Markdown
//! syntax.
class MyClass {
...
};
Functions
Function comments should be added to the header file. Some IDEs support the Doxygen format and will display it in the ToolTips.
Every function should have a \brief
set aswell as a \param
for every parameter unless the function/parameter name is self-explanatory (e.g. setter and getter methods).
If the return is not described in the \brief
or detailed description add a \return
.
//! \fn bool switchToRed(bool _delay)
//! \brief Brief description.
//! More detailed description.
//! More detailed description.
//! \param _delay Parameter description.
//! More _delay parameter description.
//! \return Return value description.
//! More return value description.
bool switchToRed(bool _delay);
Class Members
Class members should have a \brief
set. Adding \var
allows to reference that value.
class A {
int m_int; //! \brief Brief description.
//! \var m_dbl
//! \brief Description.
//! More detailed description.
//! More detailed description.
double m_dbl;
};
Enums
Enums should have a \brief
set for the enum and every entry in the enum.
//! \enum MyEnum
//! \brief Brief description.
//! More detailed description.
//! More detailed description.
enum MyEnum {
MyValue, //! \brief Description
//! \brief Brief description
//! More detailed description.
//! More detailed description.
//! \warning Warning box content.
//! More warning box content.
MySecondValue
};
Macros
Macros or preprocessor definitions should have a \brief
set.
//! \def MY_MACRO
//! \brief Brief description.
//! More detailed description.
//! More detailed description.
#define MY_MACRO
Namespaces
Notes Questions and Warnings
To display a box around the text use either \note
, \question
or \warning
.
//! \brief Brief description.
//! More detailed description.
//! More detailed description.
//! \warning Warning box content.
//! More warning content.
//! \note Note box content.
//! More note content.
//! \param _force Parameter description.
//! \return Return value decription.
bool shutdown(bool _force);
Doxygen Keywords
Here is a little cheat sheet for the common doxygen keywords.
Command/Keyword |
Description |
Example |
---|---|---|
a |
Documents a parameter or return value as an argument. |
//! Foo uses (\a _arg) to determine what to do.
void foo(int _arg);
|
addtogroup |
Creates a new group or adds entities to a group. |
//! \addtogroup TestGroup @{
bool foo(void);
bool boo(void);
//! @}
|
attention |
Documents a note or additional information that requires special attention. |
//! \attention Attention text
|
brief |
Provides a brief description of an entity. |
//! \brief Brief description.
void foo(void);
|
bug |
Documents a known bug. |
//! \bug This is doing nothing
|
c |
Marks text as code. |
//! Foo uses an (\c int) as a argument.
void foo(int _arg);
|
class |
Documents a class. |
//! \class MyClass
class MyClass {};
|
code |
Indicates the start of a code block. |
//! \code
//! Code line
//! Code line
//! \endcode
|
copybrief |
Copies the brief description from another entity. |
//! \brief Brief description that will also be copied to B.
class A {};
//! \brief Brief description for B.
//! \copybrief A
class B : public A {};
|
copydetails |
Copies the detailed description from another entity. |
//! \brief Brief description
//! Detailed description that will be copied to B.
class A {};
//! \brief Brief description for B.
//! \copydetails A
class B : public A {};
|
def |
Documents a macro or preprocessor definition. |
//! \def MY_MACRO
#define MY_MACRO
|
defgroup |
Defines a group. |
//! \defgroup MyGroup Brief group description.
|
deprecated |
Marks an entity as deprecated. |
//! \deprecated Use boo instead.
[[deprecated("Use boo instead")]]
void foo(void) {
...
|
enum |
Documents an enumeration. |
//! \enum MyEnum
enum MyEnum {};
|
enumclass |
Documents a scoped enumeration. |
//! \enumclass MyEnumClass
enum class MyEnumClass {};
|
file |
Documents a file. |
//! \file MyFile.h
|
fn |
Documents a function. |
//! \fn void foo(void)
void foo(void);
|
ingroup |
Assigns an entity to a group. |
//! \ingroup TestGroup
|
label |
Creates a unique identifier to the specified entity allowing to reference it later. |
//! \label label_name
void foo(void);
|
link |
Creates a hyperlink to another entity. |
//! For more information check \link void boo(void) \endlink
void foo(void);
|
mainpage |
Documents the main page of the project. |
//! \mainpage The Main Page Title
|
namespace |
Documents a namespace. |
//! \namespace MyNamespace
namespace MyNamespace {}
|
namespacealias |
Documents a namespace alias. |
//! \namespacealias MyAlias
namespace MyAlias = test;
|
note |
Documents a note or additional information. |
//! \note Note text
|
param |
Documents a function parameter. |
//! \param _myParam Brief parameter description.
void foo(int _myParam);
|
page |
Documents a page (e.g., overview, tutorial). |
//! \page MyPageName Page Title
//! Brief page description
|
pagebreak |
Inserts a page break in the documentation. |
//! \pagebreak
|
ref |
Creates a cross-reference to another entity. |
//! For more information check out \ref label_name.
|
relates |
Indicates a related function or class. Is used to establish relationship between different entities if not done automatically. |
class MyClass {};
//! \relates MyClass
void foo(MyClass _arg);
|
return |
Documents the return value of a function. |
//! \return Brief return description.
bool foo(void);
|
see |
Provides a cross-reference to another entity. |
void MyClass::foo(void);
//! \see MyClass, foo
void boo(void);
|
since |
Documents the version when an entity was introduced. |
//! \since YYYY-MM-DD
|
struct |
Documents a struct. |
//! \struct MyStruct
struct MyStruct {};
|
tparam |
Documents a template parameter. |
//! \tparam T Brief template parameter description.
template <class T> void foo(T _arg) {}
|
todo |
Marks a to-do item in the documentation. |
void foo(void) {
//! \todo Think of functionality
}
|
typedef |
Documents a type definition. |
//! \typedef MyType
typedef int MyType;
|
union |
Documents a union. |
//! \union MyUnion
union MyUnion {};
|
unionclass |
Documents a scoped union. |
//! \unionclass MyUnionClass
union class MyUnionClass {};
|
until |
Documents the version until which an entity exists. |
//! \until YYYY-MM-DD
|
var |
Documents a variable or member variable. |
class A {
//! \var m_var
int m_var;
};
|
warning |
Documents a warning. |
//! \warning Warning text
|
Markdown Syntax
Here is a little cheat sheet for markdow comments. Note that the spaces after the prefixes are mandatory. Also note that markdown uses spaces for the indent (which should be used anyway).
# Level 1 Header
## Level 2 Header
```
###### Level 6 Header
Regular text.
More regular text.
Code block.
More code.
- - - // This is a horizontal ruler
> Multiline
> block quote
*text emphasis*
**strong text emphasis**
~~striketrough text~~
- Bulletlist Item
Detailed Text
- Bulletlist Item 2
+ Child item 1
+ Child item 2
- Bulletlist Item 3
1. Numbered child 1 list 1
1. Numbered child 2 list 1
2. Numbered child 1 list 2
3. Numbered child 1 list 3