Wiki » Historique » Version 212
Patrice Nadeau, 2026-01-19 16:32
| 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 | 212 | Patrice Nadeau | (A..Z, 0..9, _) |
| 60 | 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` |
| 61 | 192 | Patrice Nadeau | |
| 62 | > Dans ce cas, la documentation doit indiquer le substitut à utiliser |
||
| 63 | > Pour la définition d’une valeur entière signée (int), un `enum` DOIT être utilisé. |
||
| 64 | 1. Définition conditionnel : Utiliser une forme évitant les répétitions. |
||
| 65 | 210 | Patrice Nadeau | 1. Macros `#warning` et `#error` : Utilisées pour afficher des avertissements ou des erreurs lors de la compilation. |
| 66 | 192 | Patrice Nadeau | |
| 67 | > N’est pas documenté dans Doxygen. |
||
| 68 | |||
| 69 | 210 | Patrice Nadeau | 1. Un `#define` est utilisé pour remplacer une valeur au moment de la compilation |
| 70 | 1 | Patrice Nadeau | |
| 71 | 210 | Patrice Nadeau | > Pour la définition d'une valeur entière, un `enum` DOIT être utilisé. |
| 72 | 1 | Patrice Nadeau | |
| 73 | ## Énumérations |
||
| 74 | DOIT être utilisée pour définir une série de valeurs. |
||
| 75 | |||
| 76 | * Permet l’utilisation dans une boucle avec des valeurs prédéfinis |
||
| 77 | |||
| 78 | ## Typedef |
||
| 79 | 1. En minuscule |
||
| 80 | 1. Suivie des caractères **_t** |
||
| 81 | |||
| 82 | ## Structures |
||
| 83 | ```c |
||
| 84 | /** |
||
| 85 | * @brief Structure d'un menu local |
||
| 86 | * @sa MenuSelect |
||
| 87 | */ |
||
| 88 | struct menu { |
||
| 89 | /** @brief Caractère utilisé pour l'item */ |
||
| 90 | char choice; |
||
| 91 | /** @brief Description de l'item */ |
||
| 92 | char *item; |
||
| 93 | }; |
||
| 94 | ``` |
||
| 95 | |||
| 96 | ## Fonctions |
||
| 97 | 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. |
||
| 98 | |||
| 99 | 1. Le nom DOIT être dans le format suivant : _module_**_**_action_**_**_attribut_ |
||
| 100 | 1. *module* signifie |
||
| 101 | * Le nom d'un objet ou de la librairie |
||
| 102 | 1. *action* signifie : |
||
| 103 | * set, get, clear : Règle, obtient ou vide un registre |
||
| 104 | * read, write : Lis ou écris dans un fichier |
||
| 105 | * init : Fonction d’initialisation |
||
| 106 | * is : Vérifie un état |
||
| 107 | * setup : Fonction de configuration des ports (p. ex. : AVR) |
||
| 108 | 1. *attribut* signifie |
||
| 109 | > TODO |
||
| 110 | 1. Le modificateur `static` DOIT être utilisé dans la déclaration d’une fonction avec une vue locale |
||
| 111 | 1. DOIT contenir qu’un seul `return` |
||
| 112 | 207 | Patrice Nadeau | |
| 113 | ## Fichiers |
||
| 114 | Structure des répertoires et fichiers |
||
| 115 | |||
| 116 | > Format selon la commande `tree --charset ascii` |
||
| 117 | |||
| 118 | ``` |
||
| 119 | . |
||
| 120 | |-- AUTHORS : Fichier contenant les noms et courriels des auteurs |
||
| 121 | |-- bin : Répertoire contenant le fichier exécutable et les librairies compilées |
||
| 122 | |-- ChangeLog : Fichier des changements |
||
| 123 | |-- config.h : Fichier optionel contenant les macros communes au programme dans son ensemble (-imacros) |
||
| 124 | |-- COPYING : Fichier de licence (standard GNU) |
||
| 125 | |-- docs : Répertoire de la documentation (.pdf) |
||
| 126 | |-- include : Répertoire des fichiers d’en-tête (.h) |
||
| 127 | |-- INSTALL |
||
| 128 | |-- lib : Répertoire des libraires externes (liens symboliques) |
||
| 129 | |-- Makefile.in : Fichier d'informations spécifiques du projet pour le Makefile |
||
| 130 | |-- NEWS : |
||
| 131 | |-- obj : Répertoire contenant les objets (.o) |
||
| 132 | |-- README : Fichier d'informations du projet, en format markdown |
||
| 133 | `-- src : Répertoire des fichiers sources (.c) |
||
| 134 | ``` |
||
| 135 | |||
| 136 | 1. Nom du fichier : |
||
| 137 | * Un préfixe en anglais de **8** caractères maximum pouvant contenir : |
||
| 138 | * Lettres minuscule |
||
| 139 | * Chiffres |
||
| 140 | * Trait de soulignement |
||
| 141 | * DOIT contenir un des suffixe suivants : |
||
| 142 | * `.h` : entête |
||
| 143 | * `.c` : sources |
||
| 144 | 1. Contenus |
||
| 145 | * Section Doxygen : |
||
| 146 | 1. `@file` : Le nom du fichier |
||
| 147 | 1. `@brief`: Une brève description |
||
| 148 | 1. `@version`: Le numéro de version |
||
| 149 | 1. `@date`: La date de dernière modification |
||
| 150 | 1. `@author`: Une liste des participant(e)s et leur courriel |
||
| 151 | 1. `@copyright`: La liste des années et participant(e)s |
||
| 152 | * Les fichiers d’entête contiennent en plus |
||
| 153 | 1. Une définition macro pour éviter de ré-inclure le fichier (<https://fr.wikipedia.org/wiki/Include_guard>). |
||
| 154 | |||
| 155 | |||
| 156 | 1 | Patrice Nadeau | |
| 157 | 159 | Patrice Nadeau | [[Atmel AVR]] |