| 184 | '' |
| 185 | }}} |
| 186 | 1. Quelle est la différence entre `#include "file.h"` et `#include <file.h>` ? Quelle option du compilateur C permet de spécifier les répertoires lesquels se trouvent les fichiers include ? Si vous ne savez pas interrogez Internet ! |
| 187 | {{{#!protected ------------------------------------------------------------------------------------ |
| 188 | '' |
| 189 | Cours 9 / slides 18 et 58\\\\ |
| 190 | Ce sont toujours des connaissances connues en principe, mais comme c'est utilisé dans le code, ce n'est pas inutile d'en parler rapidement. |
| 191 | * Avec `#include "file.h"`, le préprocesseur recherche le fichier dans le répertoire local. |
| 192 | * Avec `#include <file.h>`, le préprocesseur recherche le fichier dans les répertoires standards tel que `/usr/include` et dans les répertoires spécifiés par l'option `-I` du préprocesseur. Il peut y avoir plusieurs fois `-I` dans la commande, par exemple `-Idir1 -Idir2 -Idir3`. |
| 193 | * C'est donc l'option `-I` qui permet de définir les répertoires de recherche. |
| 194 | '' |
| 195 | }}} |
| 196 | 1. Comment définir une macro-instruction C uniquement si elle n'est pas déjà définie ? Écrivez un exemple. Si vous ne savez pas regardez l'usage de `#ifndef` |
| 197 | {{{#!protected ------------------------------------------------------------------------------------ |
| 198 | '' |
| 199 | Cours 9 / slides 9 et 58\\\\ |
| 200 | Cette déclaration est présente à plusieurs endroits dans le code. Elle permet de définir des valeurs de paramètres par défaut, s'ils ne sont pas déjà définis ailleurs, soit plus haut dans le code, ou dans un fichier inclu, ou encore passé en paramètre du compilateur par l'option `-D`. |
| 201 | * En utilisant, une directive `#ifndef` : |
| 202 | {{{#!c |
| 203 | #ifndef MACRO |
| 204 | #define MACRO |
| 205 | #endif |
| 206 | }}} |
| 207 | '' |
| 208 | }}} |
| 209 | 1. Comment être certain de ne pas inclure plusieurs fois le même fichier `.h` ? Vous devriez avoir trouvé l'explication en répondant à la question précédente. |
| 210 | {{{#!protected ------------------------------------------------------------------------------------ |
| 211 | '' |
| 212 | Cours 9 / slides 9 et 58\\\\ |
| 213 | C'est un usage de ce qui a été vu dans la question précédente. C'est utilisé dans tous les fichiers .h (sauf oubli). |
| 214 | * En utilisant ce que nous venons de voir dans la question précédente : on peut définir une macro instruction différente au début de chaque fichier `.h` (en utilisant le nom du fichier comme nom de macro pour éviter les collisions de nom). On peut alors tester l'existence de cette macro comme condition d'inclusion du fichier. |
| 215 | {{{#!c |
| 216 | ————————————————————— debut du fichier filename.h |
| 217 | #ifndef _FILENAME_H_ |
| 218 | #define _FILENAME_H_ |
| 219 | |
| 220 | [... contenu du fichier ...] |
| 221 | |
| 222 | #endif |
| 223 | ————————————————————— fichier de fichier filename.h |
| 224 | }}} |