Projet

Général

Profil

Wiki » Historique » Version 219

Patrice Nadeau, 2026-01-20 16:58

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