annotate STYLE.md @ 52:02ec33e7ca7f default tip @

minor fixes
author David Demelier <markand@malikania.fr>
date Thu, 17 Dec 2020 10:33:19 +0100
parents 884ef6321dcc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
1 PROJECT_NAME CODING STYLE
17
314e8bb2659a Rename STYLE_CPP.md to STYLE.md
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
2 =========================
314e8bb2659a Rename STYLE_CPP.md to STYLE.md
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
3
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
4 File content
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
5 ============
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
6
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
7 - Use UTF-8 charset,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
8 - Use Unix line endings,
46
a3cebf1d437a typo in STYLE.md
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
9 - Never write two consecutives blank lines.
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
10
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
11 Indent
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
12 ======
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
13
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
14 Use tabs to indent and spaces for alignment. Tabs are meant and designed for
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
15 indenting code and have the advantage of being configurable. On the other hand
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
16 to keep code clean, you must align content with spaces only *within* a line.
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
17
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
18 Note: we recommend 8 columns to avoid high number of indentations.
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
19
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
20 Example (show whitespace in your editor)
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
21
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
22 ```cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
23 class foo {
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
24 public:
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
25 enum type {
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
26 dummy_value, // dummy comment
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
27 other_value // other comment
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
28 };
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
29
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
30 void long_function_name(very_long_type x1,
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
31 very_long_type x2)
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
32 {
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
33 const map<string, string> m{
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
34 { "hostname", "127.0.0.1" },
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
35 { "port", "6667" }
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
36 };
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
37 }
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
38 };
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
39 ```
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
40
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
41 As a rule of thumb, tabs must always be all length.
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
42
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
43 Example of incorrect usage:
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
44
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
45 ```cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
46 { "hostname", "127.0.0.1" },
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
47 { "port", "6667" }
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
48 ```
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
49
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
50 This example will not align correctly if tabstops are not set to 8.
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
51
51
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
52 C
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
53 =
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
54
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
55 Style
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
56 -----
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
57
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
58 - Do not exceed 80 columns.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
59
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
60 ### Braces
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
61
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
62 Braces follow the K&R style, they are never placed on their own lines except for
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
63 function definitions.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
64
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
65 Do not put braces for single line statements.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
66
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
67 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
68 if (condition) {
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
69 apply();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
70 add();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
71 } else
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
72 ok();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
73
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
74 if (condition)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
75 validate();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
76
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
77 if (foo)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
78 state = long + conditional + that + requires + several + lines +
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
79 to + complete;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
80 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
81
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
82 Functions require braces on their own lines.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
83
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
84 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
85 void
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
86 function()
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
87 {
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
88 }
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
89 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
90
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
91 Note: the type of a function is broken into its own line.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
92
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
93 ### Spaces
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
94
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
95 Each reserved keyword (e.g. `if`, `for`, `while`) requires a single space before
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
96 its argument.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
97
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
98 Normal function calls do not require it.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
99
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
100 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
101 if (foo)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
102 destroy(sizeof (int));
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
103 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
104
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
105 ### Pointers
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
106
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
107 Pointers are always next variable name.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
108
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
109 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
110 void
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
111 cleanup(struct owner *owner);
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
112 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
113
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
114 ### Typedefs
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
115
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
116 Do not use typedef for non-opaque objects. It is allowed for function pointers.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
117
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
118 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
119 struct pack {
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
120 int x;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
121 int y;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
122 };
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
123
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
124 typedef void (*logger)(const char *line);
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
125 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
126
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
127 Note: do never add `_t` suffix to typedef's.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
128
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
129 ### Naming
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
130
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
131 - English names,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
132 - No hungarian notation,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
133
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
134 Almost everything is in `underscore_case` except macros and enumeration
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
135 constants.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
136
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
137 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
138 #if defined(FOO)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
139 # include <foo.hpp>
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
140 #endif
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
141
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
142 #define MAJOR 1
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
143 #define MINOR 0
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
144 #define PATCH 0
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
145
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
146 enum color {
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
147 COLOR_RED,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
148 COLOR_GREEN,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
149 COLOR_BLUE
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
150 };
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
151
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
152 void
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
153 add_widget(const struct widget *widget_to_add);
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
154 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
155
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
156 ### Header guards
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
157
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
158 Do not use `#pragma once`.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
159
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
160 Header guards are usually named `PROJECT_COMPONENT_FILENAME_H`.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
161
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
162 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
163 #ifndef FOO_COMMON_UTIL_H
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
164 #define FOO_COMMON_UTIL_H
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
165
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
166 #endif /* !FOO_COMMON_UTIL_HPP */
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
167 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
168
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
169 ### Enums
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
170
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
171 Enumerations constants are always defined in separate line to allow commenting
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
172 them as doxygen.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
173
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
174 Note: enumeration constants are prefixed with its name.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
175
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
176 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
177 enum color {
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
178 COLOR_RED,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
179 COLOR_GREEN,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
180 COLOR_BLUE
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
181 };
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
182 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
183
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
184 ### Switch
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
185
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
186 In a switch case statement, you **must** not declare variables and not indent
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
187 cases.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
188
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
189 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
190 switch (variable) {
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
191 case foo:
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
192 do_some_stuff();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
193 break;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
194 default:
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
195 break;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
196 }
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
197 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
198
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
199 ### Files
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
200
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
201 - Use `.c` and `.h` as file extensions,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
202 - Filenames are all lowercase.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
203
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
204 ### Comments
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
205
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
206 Avoid useless comments in source files. Comment complex things or why it is done
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
207 like this. Do not use `//` style comments in C.
51
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
208
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
209 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
210 /*
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
211 * Multi line comments look like
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
212 * this.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
213 */
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
214
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
215 /* Short comment. */
51
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
216 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
217
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
218 Use `#if 0` to comment blocks of code.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
219
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
220 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
221 #if 0
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
222 broken_stuff();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
223 #endif
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
224 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
225
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
226 ### Includes
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
227
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
228 The includes should always come in the following order.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
229
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
230 1. System headers (POSIX mostly)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
231 2. C header
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
232 3. Third party libraries
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
233 4. Application headers in ""
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
234
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
235 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
236 #include <sys/types.h>
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
237 #include <sys/stat.h>
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
238 #include <string.h>
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
239
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
240 #include <libircclient.h>
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
241
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
242 #include "foo.h"
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
243 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
244
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
245 Programming
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
246 -----------
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
247
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
248 ### C Standard
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
249
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
250 Use C11 standard without extensions.
51
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
251
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
252 ### Assertions
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
253
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
254 Use the `assert` macro from the assert.h header file to verify programming
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
255 errors.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
256
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
257 For example, you may use `assert` to verify that the developer access the data
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
258 between the bounds of an array:
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
259
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
260 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
261 int
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
262 get(struct data *data, unsigned index)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
263 {
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
264 assert(index < data->length);
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
265
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
266 return data->buffer[index];
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
267 }
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
268 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
269
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
270 The `assert` macro is not meant to check that a function succeeded, this code
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
271 must not be written that way:
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
272
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
273 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
274 assert(listen(10));
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
275 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
276
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
277 ### Return
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
278
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
279 The preferred style is to return early in case of errors. That makes the code
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
280 more linear and not highly indented.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
281
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
282 This code is preferred:
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
283
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
284 ```c
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
285 if (a_condition_is_not_valid)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
286 return false;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
287 if (an_other_condition)
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
288 return false;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
289
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
290 start();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
291 save();
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
292
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
293 return true;
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
294 ```
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
295
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
296 Additional rules:
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
297
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
298 - Do never put parentheses between the returned value,
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
299 - Do not put a else branch after a return.
884ef6321dcc add C style
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
300
17
314e8bb2659a Rename STYLE_CPP.md to STYLE.md
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
301 C++
314e8bb2659a Rename STYLE_CPP.md to STYLE.md
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
302 ===
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
303
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 Style
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 -----
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
306
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
307 - Do not exceed 120 columns for lines of code,
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
308 - Do not exceed 80 columns for comments,
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
309
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 ### Braces
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
311
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 Braces follow the K&R style, they are never placed on their own lines except for
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 function definitions.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
314
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
315 Do not put braces for single line statements.
10
eaae1fcabca8 Update braces style
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
316
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
317 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
318 if (condition) {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
319 apply();
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
320 add();
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
321 } else
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
322 ok();
10
eaae1fcabca8 Update braces style
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
323
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
324 if (condition)
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
325 validate();
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
326
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
327 if (foo)
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
328 state = long + conditional + that + requires + several + lines +
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
329 to + complete;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
330 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
331
10
eaae1fcabca8 Update braces style
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
332 Functions require braces on their own lines.
eaae1fcabca8 Update braces style
David Demelier <markand@malikania.fr>
parents: 9
diff changeset
333
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
334 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
335 void function()
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
336 {
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
337 }
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
338 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
339
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 And a lambda has its braces on the same lines too:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
341
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
342 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
343 sort([&] (auto&) {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
344 return true;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
345 });
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
346 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
347
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 ### Spaces
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
349
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 Each reserved keyword (e.g. `if`, `for`, `while`) requires a single space before
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 its argument.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
352
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 Normal function calls do not require it.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
354
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
355 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
356 if (foo)
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
357 destroy(sizeof (int));
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
358 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
359
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 ### References and pointers
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
361
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 References and pointers are always next to the type name and not the variable.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
363
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
364 ```cpp
34
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
365 auto get(const std::string& name) -> T&;
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
366
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
367 int* p = &x;
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
368 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
369
34
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
370 ### Trailing return syntax
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
371
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
372 We use trailing return syntax everywhere, it has the following benefits:
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
373
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
374 - Inner types don't need to be prefixed by class name,
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
375 - Functions are kept aligned correctly, focusing on the function name.
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
376
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
377 ```cpp
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
378 auto func() -> std::string;
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
379 ```
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
380
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 ### Naming
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
382
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
383 - English names,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
384 - Member variables have trailing underscore (e.g foo\_bar\_),
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
385 - No hungarian notation.
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
386
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 Everything is in `underscore_case` except template parameters and macros.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
388
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
389 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
390 #if defined(FOO)
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
391 # include <foo.hpp>
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
392 #endif
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
393
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
394 namespace baz {
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
395
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
396 class object {
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
397 private:
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
398 std::string name_;
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
399
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
400 public:
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
401 auto name() const noexcept -> const std::string&;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
402 };
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
403
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
404 template <typename Archive>
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
405 void open(const Archive& ar)
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
406 {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
407 bool is_valid = false;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
408 }
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
409
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
410 } // !baz
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
411 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
412
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 ### Header guards
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
414
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 Do not use `#pragma once`.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
416
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
417 Header guards are usually named `PROJECT_COMPONENT_FILENAME_HPP`.
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
418
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
419 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
420 #ifndef FOO_COMMON_UTIL_HPP
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
421 #define FOO_COMMON_UTIL_HPP
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
422
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
423 #endif // !FOO_COMMON_UTIL_HPP
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
424 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
425
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 ### Enums
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
427
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 Enumerations constants are always defined in separate line to allow commenting
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 them as doxygen.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
430
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
431 Enum class are encouraged.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
432
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
433 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
434 enum class color {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
435 blue,
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
436 red,
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
437 green
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
438 };
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
439 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
440
16
780c138ab41d Add a note about switch
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
441 ### Switch
780c138ab41d Add a note about switch
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
442
780c138ab41d Add a note about switch
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
443 In a switch case statement, you **must** not declare variables and not indent
780c138ab41d Add a note about switch
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
444 cases.
780c138ab41d Add a note about switch
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
445
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
446 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
447 switch (variable) {
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
448 case foo:
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
449 do_some_stuff();
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
450 break;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
451 default:
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
452 break;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
453 }
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
454 ```
16
780c138ab41d Add a note about switch
David Demelier <markand@malikania.fr>
parents: 14
diff changeset
455
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
456 ### Files
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
457
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
458 - Use `.cpp` and `.hpp` as file extensions,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
459 - Filenames are all lowercase.
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
460
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
461 ### Comments
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
462
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 Avoid useless comments in source files. Comment complex things or why it is done
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
464 like this.
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
465
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
466 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
467 /*
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
468 * Multi line comments look like
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
469 * this.
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
470 */
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
471
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
472 // Short comment
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
473 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
474
2
1e34b51d9c52 Add note about if 0
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
475 Use `#if 0` to comment blocks of code.
1e34b51d9c52 Add note about if 0
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
476
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
477 ```cpp
2
1e34b51d9c52 Add note about if 0
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
478 #if 0
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
479 broken_stuff();
2
1e34b51d9c52 Add note about if 0
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
480 #endif
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
481 ```
2
1e34b51d9c52 Add note about if 0
David Demelier <markand@malikania.fr>
parents: 1
diff changeset
482
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
483 ### Includes
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
484
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
485 The includes should always come in the following order.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
486
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
487 1. C++ headers
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
488 2. C header
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
489 3. Third party libraries
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
490 4. Application headers in ""
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
491
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
492 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
493 #include <cstring>
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
494 #include <cerrno>
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
495
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
496 #include <sys/stat.h>
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
497
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
498 #include <libircclient.h>
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
499
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
500 #include "foo.h"
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
501 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
502
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
503 Note: always use C++ headers for C equivalent, stdio.h -> cstdio, etc.
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
504
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
505 Programming
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
506 -----------
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
507
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
508 ### C language
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
509
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
510 Do not use old C stuff like `void*`, `srand/rand`, `printf` or anything that
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
511 can be rewritten in modern C++.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
512
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
513 ### RTTI
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
514
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
515 Usage of `dynamic_cast` and `typeid` are completely disallowed in any shape of
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
516 form.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
517
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
518 ### Arguments
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
519
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
520 It is recommended to pass parameters by value or const reference. Usage of
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
521 non-const reference as output parameter is **discouraged** and should be avoided
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
522 in many case because it does not allow chaining of expressions like:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
523
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
524 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
525 std::cout << reverse(upper(clean(" hello world! "))) << std::endl;
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
526 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
527
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
528 If your function is designed to return a modified value passed as argument, it
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
529 is better to take it by value and modify it directly.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
530
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
531 ```cpp
34
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
532 auto clean(std::string input) -> std::string
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
533 {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
534 if (!input.empty() && input.back() == '\r')
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
535 input.pop_back();
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
536
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
537 return input;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
538 }
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
539 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
540
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
541 Never pass primitive types as const value.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
542
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
543 ### Assertions
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
544
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
545 Use the `assert` macro from the cassert header file to verify programming
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 errors.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
547
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
548 For example, you may use `assert` to verify that the developer access the data
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
549 between the bounds of an array:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
550
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
551 ```cpp
34
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
552 auto operator[](unsigned index) -> T&
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
553 {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
554 assert(index < length_);
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
555
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
556 return data_[index];
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
557 }
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
558 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
559
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
560 The `assert` macro is not meant to check that a function succeeded, this code
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
561 must not be written that way:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
562
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
563 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
564 assert(listen(10));
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
565 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
566
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
567 ### Exceptions
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
568
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
569 You must use exceptions to indicate an error that was unexpected such as:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
570
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
571 - Failing to open a file,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
572 - I/O unexpected errors,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
573 - Parsing errors,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
574 - User errors.
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
575
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
576 You may use the C++ standard exceptions defined in the stdexcept header but if
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
577 you need to carry more data within your exception, you should derive from
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
578 `std::exception`.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
579
14
55bb3689093f Add chapter about error codes
David Demelier <markand@malikania.fr>
parents: 13
diff changeset
580 ### Error code
55bb3689093f Add chapter about error codes
David Demelier <markand@malikania.fr>
parents: 13
diff changeset
581
55bb3689093f Add chapter about error codes
David Demelier <markand@malikania.fr>
parents: 13
diff changeset
582 You should not use error codes to indicate errors, instead use exceptions.
55bb3689093f Add chapter about error codes
David Demelier <markand@malikania.fr>
parents: 13
diff changeset
583 Error codes are allowed in Boost.Asio though.
55bb3689093f Add chapter about error codes
David Demelier <markand@malikania.fr>
parents: 13
diff changeset
584
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
585 ### Free functions
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
586
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
587 Basic utility functions should be defined in a namespace as a free function not
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
588 as a static member function, we're doing C++ not Java.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
589
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
590 Example:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
591
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
592 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
593 namespace util {
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
594
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
595 auto clean(std::string input) -> std::string;
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
596
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
597 } // !util
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
598 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
599
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
600 ### Variables initialization
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
601
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
602 Use parentheses to initialize non primitive types:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
603
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
604 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
605 throw std::runtime_error("foo");
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
606
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
607 my_class obj("bar");
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
608 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
609
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
610 Use brace initialization when you want to use an initializer list, type
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
611 elision:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
612
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
613 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
614 std::vector<int> v{1, 2, 3};
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
615
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
616 foo({1, 2}); // type deduced
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
617
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
618 return { "true", false }; // std::pair returned
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
619 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
620
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
621 Use the assignment for primitive types:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
622
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
623 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
624 int x = 123;
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
625 bool is_valid = true;
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
626 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
627
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
628 ### Classes
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
629
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
630 Classes are usually defined in the following order:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
631
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
632 1. Public inner types (enums, classes),
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
633 2. Protected/private members and functions
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
634 3. Public static functions.
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
635 3. Public member functions
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
636 4. Public virtual functions.
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
637
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
638 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
639 class foo {
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
640 public:
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
641 enum class type {
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
642 a,
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
643 b
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
644 };
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
645
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
646 private:
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
647 int member_{0};
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
648
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
649 public:
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
650 void some_function();
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
651 };
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
652 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
653
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
654 ### Structs
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
655
31
5ea2876ac37a Relax usage of structs
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
656 Use structs for objects that only need to store public data and have no
5ea2876ac37a Relax usage of structs
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
657 invariants. For example PODs and traits match this criteria:
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
658
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
659 ```cpp
31
5ea2876ac37a Relax usage of structs
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
660 struct point {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
661 int x{0};
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
662 int y{0};
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
663 };
31
5ea2876ac37a Relax usage of structs
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
664
5ea2876ac37a Relax usage of structs
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
665 template <>
5ea2876ac37a Relax usage of structs
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
666 struct info_traits<point> {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
667 template <typename Archive>
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
668 static void serialize(Archive& ar, const point& point)
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
669 {
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
670 ar.write(point.x);
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
671 ar.write(point.y);
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
672 }
31
5ea2876ac37a Relax usage of structs
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
673 };
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
674 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
675
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
676 ### Return
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
677
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
678 The preferred style is to return early in case of errors. That makes the code
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
679 more linear and not highly indented.
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
680
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
681 This code is preferred:
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
682
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
683 ```cpp
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
684 if (a_condition_is_not_valid)
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
685 return nullptr;
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
686 if (an_other_condition)
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
687 return nullptr;
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
688
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
689 auto x = std::make_shared<object>();
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
690
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
691 x->start();
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
692 x->save();
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
693
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
694 return x;
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
695 ```
0
a8462a503697 Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
696
1
9bf9b4634339 Update return statement
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
697 Additional rules:
9bf9b4634339 Update return statement
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
698
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
699 - Do never put parentheses between the returned value,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
700 - Do not put a else branch after a return.
13
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
701
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
702 ### Auto
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
703
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
704 We encorage usage of `auto`, it reduces code maintainance as you don't need to
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
705 change your code when your rename types.
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
706
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
707 ```cpp
13
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
708 auto it = std::find_if(v.begin(), v.end(), [&] (const auto& obj) {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
709 return obj.key() == "foo";
13
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
710 });
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
711
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
712 for (const auto& pair : a_map)
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
713 std::cout << pair.first << " = " << pair.second << std::endl;
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
714 ```
13
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
715
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
716 But do not use `auto` to write code like in python, this is not acceptable:
4d6bf8b3446d Add chapter about auto
David Demelier <markand@malikania.fr>
parents: 12
diff changeset
717
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
718 ```cpp
34
3bf129646979 Add TRS paragraph
David Demelier <markand@malikania.fr>
parents: 33
diff changeset
719 auto o = my_object("foo");
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
720 ```
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
721
32
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
722 ### String views
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
723
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
724 Use `std::string_view` each time you need a string that you will not own, this
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
725 includes: temporary arguments, return values, compile time constants.
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
726
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
727 ```cpp
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
728 const std::string_view version("1.0");
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
729
33
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
730 void load(std::string_view id, std::string_view path)
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
731 {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
732 std::cout << "loading: " << id << " from path: " << path << std::endl;
33
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
733 }
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
734 ```
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
735
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
736 ### Optional values
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
737
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
738 Use `std::optional` to indicate a null value considered as valid. For example,
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
739 searching a value that may not exist.
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
740
793a60620477 Add paragraph about std::optional
David Demelier <markand@malikania.fr>
parents: 32
diff changeset
741 ```cpp
32
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
742 auto find(std::string_view id) -> std::optional<int>
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
743 {
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
744 if (auto it = foo.find(id); it != foo.end())
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
745 return it->second;
32
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
746
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
747 return std::nullopt;
32
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
748 }
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
749 ```
651aee870e36 Add paragraph about std::string_view
David Demelier <markand@malikania.fr>
parents: 31
diff changeset
750
35
6114710feda7 Add paragraph about code in headers
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
751 ### Avoid definitions in headers
6114710feda7 Add paragraph about code in headers
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
752
6114710feda7 Add paragraph about code in headers
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
753 Try to avoid as much as possible function definition in header file. It slow
6114710feda7 Add paragraph about code in headers
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
754 down compilation because the compiler has to parse the syntax over and over.
6114710feda7 Add paragraph about code in headers
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
755 It's even worse as you may need to recompile a lot of files when you change a
6114710feda7 Add paragraph about code in headers
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
756 header rather than a source file.
6114710feda7 Add paragraph about code in headers
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
757
44
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
758 Shell
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
759 =====
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
760
47
685b81f3c89e use POSIX shell
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
761 Write POSIX shell only with no bash, zsh or any extension.
44
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
762
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
763 Style
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
764 -----
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
765
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
766 - Try to keep lines shorter than 80 columns
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
767
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
768 Functions
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
769 ---------
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
770
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
771 Don't use `function` keyword, just keep the function name.
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
772
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
773 ```sh
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
774 usage()
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
775 {
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
776 }
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
777 ```
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
778
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
779 It's usually recommended to prefix functions names with the program name to
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
780 avoid collisions with global commands.
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
781
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
782 ```sh
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
783 foo_clean()
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
784 {
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
785 }
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
786
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
787 foo_process()
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
788 {
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
789 }
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
790 ```
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
791
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
792 Options
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
793 -------
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
794
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
795 For options, use `getopts` and prefer short options to long unless necessary.
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
796 Also set OPTERR=0 to avoid printing errors and do it yourself for UX
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
797 consistency.
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
798
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
799 ```sh
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
800 OPTERR=0
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
801 while getopts "v" arg; do
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
802 case $arg in
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
803 v)
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
804 verbose=1
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
805 ;;
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
806 esac
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
807 done
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
808 ```
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
809
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
810 Naming
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
811 ------
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
812
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
813 Use `UPPERCASE` variables for global variables and `lowercase` for temporary or
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
814 local variables.
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
815
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
816 CMake
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
817 =====
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
818
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
819 Style
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
820 -----
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
821
44
1230716dd497 Add section about shell
David Demelier <markand@malikania.fr>
parents: 40
diff changeset
822 - Try to keep lines shorter than 80 columns
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
823
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
824 ### Spaces
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
825
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
826 Each programming keyword (e.g. `if`, `foreach`, `while`) requires a single space
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
827 before its argument, otherwise write opening parenthese directly after.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
828
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
829 ```cmake
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
830 foreach (c ${COMPONENTS})
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
831 string(TOUPPER ${c} CMP)
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
832
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
833 if (${WITH_${CMP}})
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
834 add_executable(${c} ${c}.cpp)
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
835 endif ()
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
836 endforeach ()
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
837 ```
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
838
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
839 ### Line breaks
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
840
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
841 When CMake lines goes too long, you should indent arguments at the same level,
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
842 it's also common to see named argument values indented even more.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
843
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
844 ```cmake
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
845 set(
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
846 FILES
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
847 ${myapp_SOURCE_DIR}/main.cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
848 ${myapp_SOURCE_DIR}/foo.cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
849 ${myapp_SOURCE_DIR}/bar.cpp
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
850 )
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
851
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
852 command_with_lot_of_arguments(
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
853 TARGET foo
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
854 INSTALL On
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
855 SOURCES
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
856 ${myapp_SOURCE_DIR}/main.cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
857 ${myapp_SOURCE_DIR}/foo.cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
858 ${myapp_SOURCE_DIR}/bar.cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
859 COMMENT "Some comment"
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
860 ```
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
861
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
862 Modern CMake
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
863 ------------
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
864
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
865 CMake evolves over time, if you have read very old articles there is a chance
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
866 that what you have read is actually deprecated and replaced by other features.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
867 The following list is a short summary of modern CMake features that you must
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
868 use.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
869
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
870 ### Imported targets
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
871
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
872 When they are available, use imported targets rather than plain variables. They
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
873 offer complete dependency tracking with options and include directories as well.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
874
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
875 ```cmake
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
876 find_package(Boost COMPONENTS system)
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
877 target_link_libraries(main Boost::system)
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
878 ```
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
879
40
cb25a20c1fc9 Update generator expressions paragraph
David Demelier <markand@malikania.fr>
parents: 39
diff changeset
880 ### Generator expressions
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
881
40
cb25a20c1fc9 Update generator expressions paragraph
David Demelier <markand@malikania.fr>
parents: 39
diff changeset
882 Use generator expressions when it make sense. For example you should use them
cb25a20c1fc9 Update generator expressions paragraph
David Demelier <markand@malikania.fr>
parents: 39
diff changeset
883 for variables that are not used at generation time (e.g CMAKE\_BUILD\_TYPE).
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
884
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
885 ```cmake
40
cb25a20c1fc9 Update generator expressions paragraph
David Demelier <markand@malikania.fr>
parents: 39
diff changeset
886 target_include_directories(
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
887 myapp
40
cb25a20c1fc9 Update generator expressions paragraph
David Demelier <markand@malikania.fr>
parents: 39
diff changeset
888 $<BUILD_INTERFACE:${myapp_SOURCE_DIR}>
cb25a20c1fc9 Update generator expressions paragraph
David Demelier <markand@malikania.fr>
parents: 39
diff changeset
889 $<INSTALL_INTERFACE:include>
cb25a20c1fc9 Update generator expressions paragraph
David Demelier <markand@malikania.fr>
parents: 39
diff changeset
890 )
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
891 ```
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
892
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
893 Warning: do never test against `CMAKE_BUILD_TYPE` in any CMakeLists.txt, IDEs
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
894 like Visual Studio will mismatch what you'll put in the conditions.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
895
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
896 ### Avoid global scoping
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
897
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
898 The following commands must be avoided as much as possible:
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
899
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
900 - `link_directories`,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
901 - `link_libraries`,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
902 - `include_directories`,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
903 - `add_definitions`.
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
904
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
905 They pollute the global namespace, all targets defined after these commands will
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
906 be built against those settings. Instead, you should use the per-targets
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
907 commands.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
908
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
909 ```cmake
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
910 target_include_directories(
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
911 mylib
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
912 PUBLIC
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
913 $<BUILD_INTERFACE:${mylib_SOURCE_DIR}>
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
914 $<INSTALL_INTERFACE:include>
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
915 )
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
916 target_link_libraries(mylib foo)
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
917 ```
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
918
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
919 ### Defining sources
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
920
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
921 You MUST never use any kind of `file(GLOB)` commands to list sources for an
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
922 executable. CMake is designed to be re-called by itself only when required,
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
923 having such a construct will not let CMake be able to detect if you have
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
924 added/removed files in your source directory. Instead, you MUST always specify
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
925 all source by hands.
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
926
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
927 ```cmake
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
928 set(
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
929 FILES
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
930 ${myapp_SOURCE_DIR}/main.cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
931 ${myapp_SOURCE_DIR}/a.cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
932 ${myapp_SOURCE_DIR}/b.cpp
25
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
933 )
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
934
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
935 add_executable(myapp ${FILES})
9573e6c9ac97 Add CMake guide in STYLE.md
David Demelier <markand@malikania.fr>
parents: 17
diff changeset
936 ```
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
937
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
938 Markdown
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
939 ========
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
940
37
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
941 Headers
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
942 -------
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
943
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
944 For 1st and 2nd level headers, use `===` and `---` delimiters and underline the
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
945 whole title. Otherwise use `###`.
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
946
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
947 ```markdown
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
948 Top level title
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
949 ===============
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
950
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
951 Sub title
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
952 ---------
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
953
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
954 ### Header 3
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
955
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
956 #### Header 4
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
957
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
958 ##### Header 5
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
959
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
960 ###### Header 6
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
961 ```
a77a41f83ebb Add header style to markdown
David Demelier <markand@malikania.fr>
parents: 35
diff changeset
962
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
963 Lists
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
964 -----
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
965
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
966 Use hyphens for unordered lists for consistency, do not indent top level lists,
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
967 then indent by two spaces each level
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
968
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
969 ```markdown
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
970 - unordered list 1
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
971 - unordered list 2
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
972 - sub unordered item
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
973
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
974 1. unordered list 1
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
975 2. unordered list 2
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
976 2.1. sub unordered item
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
977 ```
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
978
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
979 Code blocks
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
980 -----------
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
981
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
982 You can use three backticks and the language specifier or just indent a block by
52
02ec33e7ca7f minor fixes
David Demelier <markand@malikania.fr>
parents: 51
diff changeset
983 for leading tabs if you don't need syntax.
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
984
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
985 ```cpp
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
986 std::cout << "hello world" << std::endl;
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
987 ```
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
988
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
989 And without syntax:
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
990
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
991 ```markdown
39
ddf3183ec5ce Add indent paragraph
David Demelier <markand@malikania.fr>
parents: 37
diff changeset
992 This is simple code block.
27
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
993 ```
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
994
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
995 Tables
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
996 ------
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
997
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
998 Tables are supported and formatted as following:
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
999
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
1000 ```markdown
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
1001 | header 1 | header 2 |
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
1002 |----------|----------|
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
1003 | item 1 | item 2 |
0706d01e073f Update markdown convention and add it to STYLE.md
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
1004 ```
28
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1005
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1006 Alerts
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1007 ------
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1008
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1009 It's possible to prefix a paragraph by one of the following topic, it renders a
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1010 different block depending on the output format:
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1011
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1012 - Note:
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1013 - Warning:
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1014 - Danger:
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1015
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1016 Then, if the paragraph is too long, indent the text correctly.
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1017
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1018 ```markdown
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1019 Note: this is an information block that is too long to fit between the limits so
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1020 it is split and indented.
1a9a76f94955 Add alerts in markdown style
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
1021 ```