Projet

Général

Profil

Wiki » Historique » Version 205

Patrice Nadeau, 2026-01-18 20:44

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