Projet

Général

Profil

Wiki » Historique » Version 233

Patrice Nadeau, 2026-10-12 11:29

1 1 Patrice Nadeau
# Règles de codage C
2
3 175 Patrice Nadeau
Le langage C utilisé avec le compilateur GCC :
4 233 Patrice Nadeau
* Standard [C99](https://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf) (`-std=gnu99`)
5 177 Patrice Nadeau
* Extensions GNU
6 179 Patrice Nadeau
    * **__attribute__((deprecated))** (`-Wdeprecated-declaration`)
7
    * **__attribute__((noreturn))**
8 181 Patrice Nadeau
    * **#pragma GCC message ""**
9
    * **#pragma GCC warning ""**
10
    * **#pragma GCC error ""**
11 194 Patrice Nadeau
12
TODO : `static` & `const`
13 1 Patrice Nadeau
    
14
---
15 184 Patrice Nadeau
16 193 Patrice Nadeau
{{>TOC}}
17
18
---
19
20 195 Patrice Nadeau
## Style 
21 226 Patrice Nadeau
DOIT 
22
* être de style [Allman](https://fr.wikipedia.org/wiki/Style_d%27indentation#Style_Allman)
23 1 Patrice Nadeau
    > Respecte un alignement strict des accolades ouvrantes et fermantes
24 226 Patrice Nadeau
* utiliser une indentation de **4** espaces
25
* contenir des ligne d'au plus **80** caractères
26 195 Patrice Nadeau
    > La barre oblique inversée DOIT être utilisée dans les longues chaine de caractères (string)
27 229 Patrice Nadeau
* contenir qu'une instruction par ligne
28
* contenir des espaces avant et après un opérateur sauf pour les opérateurs [unaires](https://fr.wikipedia.org/wiki/Op%C3%A9ration_unaire)
29
* avoir la constante placée à la gauche de l’opérateur d’équivalence (`==`)
30 1 Patrice Nadeau
    > Prévient les erreurs lors d'ajout dans les blocs d'une seule instruction
31 227 Patrice Nadeau
32
Ne DOIT PAS
33
* utilisé l’opérateur ternaire `?:`
34 195 Patrice Nadeau
35 182 Patrice Nadeau
## Identifiants
36 228 Patrice Nadeau
DOIT
37
* contenir au maximum **31** caractères (a..z, 1..9, _)
38
* être en **anglais américain**
39
* commencer par une lettre
40
* utiliser des traits de soulignement (_) pour séparer les mots
41 231 Patrice Nadeau
* laisser une ligne vide entre les fonctions
42 221 Patrice Nadeau
* Déclaration
43
    * Un objet ayant une visibilité locale DOIT avoir le modificateur `static` 
44
    * Un objet « obsolète », DOIT avoir l'un des attributs :
45 205 Patrice Nadeau
        > Génération de message lors de la compilation (`-Wall`)
46
        * `deprecated` 
47
        * `unavailable`
48 184 Patrice Nadeau
49 183 Patrice Nadeau
## Commentaires
50 221 Patrice Nadeau
* Précède l’élément à documenté, avec la même indentation
51
* En minuscules et commence par une majuscule
52
* Phrase complète en français
53
* Sur une ou plusieurs lignes
54
* De style C (/*... */)
55 232 Patrice Nadeau
56
### Doxygen
57
* Les « décorations » (gras, italique, etc.) sont faites avec la syntaxe Markdown
58
* *Note* : where you want the reader to "take notice" of the matter described in the section.
59
* *Attention* : can be used to highlight a particularly important note, one that you don't want the reader to overlook.
60
* *Warning* : should be used instead of Attention when there may be negative consequences to consider 
61
* *Remark* : can be used for notes that have lesser importance.
62
63
64 82 Patrice Nadeau
65 192 Patrice Nadeau
## Macros et préprocesseur
66 1 Patrice Nadeau
Directives du préprocesseur gcc.
67 192 Patrice Nadeau
68 230 Patrice Nadeau
DOIT
69
1. comporter au maximum **31** caractères (A..Z, 0..9, _)
70 192 Patrice Nadeau
1. Les macros ne devant plus être utilisées, DOIVENT générer un message lors de la compilation avec `#pragma GCC poison`
71
    > Dans ce cas, la documentation doit indiquer le substitut à utiliser
72
    > Pour la définition d’une valeur entière signée (int), un `enum` DOIT être utilisé.
73
1. Définition conditionnel : Utiliser une forme évitant les répétitions.
74 223 Patrice Nadeau
1. Macros utilisées pour afficher des avertissements ou des erreurs lors de la compilation.
75
    * Note : `#pragma message`
76
    * Warning : `#pragma GCC warning`
77
    * Error : `#pragma GCC error` 
78 210 Patrice Nadeau
    > N’est pas documenté dans Doxygen.
79
1. Un `#define` est utilisé pour remplacer une valeur au moment de la compilation
80 1 Patrice Nadeau
81
## Énumérations
82
DOIT être utilisée pour définir une série de valeurs.
83
84
* Permet l’utilisation dans une boucle avec des valeurs prédéfinis
85
86
## Typedef
87
1. En minuscule
88
1. Suivie des caractères **_t**
89
90
## Structures
91
```c
92
/**
93 216 Patrice Nadeau
* \brief Structure d'un menu local
94 218 Patrice Nadeau
* \sa menu_select()
95 1 Patrice Nadeau
*/
96
struct menu {
97 216 Patrice Nadeau
/** \brief Caractère utilisé pour l'item */
98 1 Patrice Nadeau
char choice;
99 216 Patrice Nadeau
/** \brief Description de l'item */
100 1 Patrice Nadeau
char *item;
101
};
102
```
103
104
## Fonctions
105
Les fonctions définies dans une librairie de bas niveau pour du matériel (« driver ») DEVRAIENT utiliser les noms définis dans la fiche technique.
106
107
1. Le nom DOIT être dans le format suivant : _module_**_**_action_**_**_attribut_
108
    1. *module* signifie
109
        * Le nom d'un objet ou de la librairie
110
    1. *action* signifie :
111
        * set, get, clear : Règle, obtient ou vide un registre
112
        * read, write : Lis ou écris dans un fichier
113
        * init : Fonction d’initialisation
114
        * is : Vérifie un état
115
        * setup : Fonction de configuration des ports (p. ex. : AVR)
116
    1. *attribut* signifie 
117
        > TODO
118
1. Le modificateur `static` DOIT être utilisé dans la déclaration d’une fonction avec une vue locale
119
1. DOIT contenir qu’un seul `return`
120 207 Patrice Nadeau
121
## Fichiers
122
Structure des répertoires et fichiers
123
124
> Format selon la commande `tree --charset ascii`
125
126
```
127
.
128
|-- AUTHORS : Fichier contenant les noms et courriels des auteurs
129
|-- bin : Répertoire contenant le fichier exécutable et les librairies compilées
130
|-- ChangeLog : Fichier des changements
131
|-- config.h : Fichier optionel contenant les macros communes au programme dans son ensemble (-imacros)
132
|-- COPYING : Fichier de licence (standard GNU)
133
|-- docs : Répertoire de la documentation (.pdf)
134
|-- include : Répertoire des fichiers d’en-tête (.h)
135
|-- INSTALL
136
|-- lib : Répertoire des libraires externes (liens symboliques)
137
|-- Makefile.in : Fichier d'informations spécifiques du projet pour le Makefile
138
|-- NEWS :
139
|-- obj : Répertoire contenant les objets (.o)
140
|-- README : Fichier d'informations du projet, en format markdown
141
`-- src : Répertoire des fichiers sources (.c)
142
```
143
144
1. Nom du fichier :
145
    * Un préfixe en anglais de **8** caractères maximum pouvant contenir :
146
        * Lettres minuscule
147
        * Chiffres
148
        * Trait de soulignement
149
    * DOIT contenir un des suffixe suivants : 
150
        * `.h` : entête
151
        * `.c` : sources
152
1. Contenus
153
    * Section Doxygen :
154
        1. `@file` : Le nom du fichier
155
        1. `@brief`: Une brève description
156
        1. `@version`: Le numéro de version
157
        1. `@date`: La date de dernière modification
158
        1. `@author`: Une liste des participant(e)s et leur courriel
159
        1. `@copyright`: La liste des années et participant(e)s
160
    * Les fichiers d’entête contiennent en plus
161
        1. Une définition macro pour éviter de ré-inclure le fichier (<https://fr.wikipedia.org/wiki/Include_guard>).
162
163
164 1 Patrice Nadeau
165 159 Patrice Nadeau
[[Atmel AVR]]