Projet

Général

Profil

Wiki » Historique » Version 211

Patrice Nadeau, 2026-01-19 16:26

1 1 Patrice Nadeau
# Règles de codage C
2
3 175 Patrice Nadeau
Le langage C utilisé avec le compilateur GCC :
4 178 Patrice Nadeau
* Standard [C99](https://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf) (`-std=c99`)
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
1. DOIT être de style [Allman](https://fr.wikipedia.org/wiki/Style_d%27indentation#Style_Allman)
22
1. L’indentation DOIT être de **4** espaces
23
1. Une ligne ne DOIT PAS avoir plus de 80 caractères
24
    > La barre oblique inversée DOIT être utilisée dans les longues chaine de caractères (string)
25
1. Une instruction par ligne
26
1. Une espace avant et après un opérateur DOIT être utilisée sauf pour les opérateurs [unaires](https://fr.wikipedia.org/wiki/Op%C3%A9ration_unaire)
27
1. L’opérateur ternaire `?:` ne DOIT PAS être utilisé
28
1. La constante DOIT être placée à la gauche de l’opérateur d’équivalence (`==`)
29
    > Prévient les erreurs lors d'ajout dans les blocs d'une seule instruction
30
31 182 Patrice Nadeau
## Identifiants
32 202 Patrice Nadeau
1. (a...z, A..Z, 0..9, _)
33 182 Patrice Nadeau
1. Ne DOIT PAS contenir plus de **31** caractères 
34 186 Patrice Nadeau
1. En **anglais américain** :
35 185 Patrice Nadeau
    * Lettres
36
        * Fonctions, variables, énumérations, structures, définition de type : 
37
            * Minuscules
38
    * Commence par une lettre
39 187 Patrice Nadeau
    * Si plusieurs mots sont utilisés, ils DOIVENT être séparées par des traits de soulignement
40
1. Déclaration
41
    1. Un objet ayant une visibilité locale DOIT avoir le modificateur `static` 
42 206 Patrice Nadeau
    1. Un objet « obsolète », DOIT avoir l'un des attributs :
43 205 Patrice Nadeau
        > Génération de message lors de la compilation (`-Wall`)
44
        * `deprecated` 
45
        * `unavailable`
46 184 Patrice Nadeau
47 183 Patrice Nadeau
## Commentaires
48 182 Patrice Nadeau
1. Précède l’élément à documenté, avec la même indentation
49
1. En minuscules et commence par une majuscule
50
1. Phrase complète en français
51
1. Sur une ou plusieurs lignes
52 191 Patrice Nadeau
1. De style C (/*... */)
53
1. Doxygen DOIT aussi être utilisé
54
    1. Les « décorations » (gras, italique, etc.) sont faites avec la syntaxe Markdown
55 82 Patrice Nadeau
56 192 Patrice Nadeau
## Macros et préprocesseur
57
Directives du préprocesseur gcc.
58
59 209 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`
60 192 Patrice Nadeau
61
    > Dans ce cas, la documentation doit indiquer le substitut à utiliser
62
    > Pour la définition d’une valeur entière signée (int), un `enum` DOIT être utilisé.
63
1. Définition conditionnel : Utiliser une forme évitant les répétitions.
64 210 Patrice Nadeau
1. Macros `#warning` et `#error` : Utilisées pour afficher des avertissements ou des erreurs lors de la compilation.
65 192 Patrice Nadeau
66
    > N’est pas documenté dans Doxygen.
67
68 210 Patrice Nadeau
1. Un `#define` est utilisé pour remplacer une valeur au moment de la compilation
69 1 Patrice Nadeau
70 210 Patrice Nadeau
    > Pour la définition d'une valeur entière, un `enum` DOIT être utilisé.
71 1 Patrice Nadeau
72
## Énumérations
73
DOIT être utilisée pour définir une série de valeurs.
74
75
* Permet l’utilisation dans une boucle avec des valeurs prédéfinis
76
77
## Typedef
78
1. En minuscule
79
1. Suivie des caractères **_t**
80
81
## Structures
82
```c
83
/**
84
* @brief Structure d'un menu local
85
* @sa MenuSelect
86
*/
87
struct menu {
88
/** @brief Caractère utilisé pour l'item */
89
char choice;
90
/** @brief Description de l'item */
91
char *item;
92
};
93
```
94
95
## Fonctions
96
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.
97
98
1. Le nom DOIT être dans le format suivant : _module_**_**_action_**_**_attribut_
99
    1. *module* signifie
100
        * Le nom d'un objet ou de la librairie
101
    1. *action* signifie :
102
        * set, get, clear : Règle, obtient ou vide un registre
103
        * read, write : Lis ou écris dans un fichier
104
        * init : Fonction d’initialisation
105
        * is : Vérifie un état
106
        * setup : Fonction de configuration des ports (p. ex. : AVR)
107
    1. *attribut* signifie 
108
        > TODO
109
1. Le modificateur `static` DOIT être utilisé dans la déclaration d’une fonction avec une vue locale
110
1. DOIT contenir qu’un seul `return`
111 207 Patrice Nadeau
112
## Fichiers
113
Structure des répertoires et fichiers
114
115
> Format selon la commande `tree --charset ascii`
116
117
```
118
.
119
|-- AUTHORS : Fichier contenant les noms et courriels des auteurs
120
|-- bin : Répertoire contenant le fichier exécutable et les librairies compilées
121
|-- ChangeLog : Fichier des changements
122
|-- config.h : Fichier optionel contenant les macros communes au programme dans son ensemble (-imacros)
123
|-- COPYING : Fichier de licence (standard GNU)
124
|-- docs : Répertoire de la documentation (.pdf)
125
|-- include : Répertoire des fichiers d’en-tête (.h)
126
|-- INSTALL
127
|-- lib : Répertoire des libraires externes (liens symboliques)
128
|-- Makefile.in : Fichier d'informations spécifiques du projet pour le Makefile
129
|-- NEWS :
130
|-- obj : Répertoire contenant les objets (.o)
131
|-- README : Fichier d'informations du projet, en format markdown
132
`-- src : Répertoire des fichiers sources (.c)
133
```
134
135
1. Nom du fichier :
136
    * Un préfixe en anglais de **8** caractères maximum pouvant contenir :
137
        * Lettres minuscule
138
        * Chiffres
139
        * Trait de soulignement
140
    * DOIT contenir un des suffixe suivants : 
141
        * `.h` : entête
142
        * `.c` : sources
143
1. Contenus
144
    * Section Doxygen :
145
        1. `@file` : Le nom du fichier
146
        1. `@brief`: Une brève description
147
        1. `@version`: Le numéro de version
148
        1. `@date`: La date de dernière modification
149
        1. `@author`: Une liste des participant(e)s et leur courriel
150
        1. `@copyright`: La liste des années et participant(e)s
151
    * Les fichiers d’entête contiennent en plus
152
        1. Une définition macro pour éviter de ré-inclure le fichier (<https://fr.wikipedia.org/wiki/Include_guard>).
153
154
155 1 Patrice Nadeau
156 159 Patrice Nadeau
[[Atmel AVR]]