Projet

Général

Profil

Wiki » Historique » Version 241

Patrice Nadeau, 2026-10-13 19:56

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