C: Inclusions dans les en-têtes
-
05-07-2019 - |
Question
Si j'ai les éléments suivants:
/*
* example.h
*/
#ifndef EXAMPLE
#define EXAMPLE
#include <stdio.h>
extern int parse_string(FILE *, char const*, const unsigned int);
#endif
Cela signifie-t-il que le code qui utilise ... #include example.h
... n'aura pas à ... #include <stdio.h>
... dépendances? (ex: <=>)
La solution
Correct - c’est pourquoi il est recommandé de limiter les en-têtes nécessaires inclus dans d’autres en-têtes. Le préprocesseur remplacera & "; #Include &"; directive avec le contenu de stdio.h, donc votre en-tête ressemblera à ceci pour le compilateur:
/*
* example.h
*/
#ifndef EXAMPLE
#define EXAMPLE
<contents of stdio.h>
extern int parse_string(FILE *, char const*, const unsigned int);
#endif
Autres conseils
Oui
Mais si le code dépend de <stdio>
, il devrait probablement l'inclure. (Après tout, <=> dispose également d'une protection contre les inclusions multiples.)
Si ce que vous voulez, c'est un maître include pour votre projet, continuez et créez-en un, mais indiquez-en à la fois les en-têtes réels et les en-têtes système communs, mais pas de prototypes, de déclarations ou de macros. C'est-à-dire que le méga include ne fait rien mais inclut. De cette manière, chaque module peut prendre ses propres décisions au fil de l'évolution du programme.
Oui, vous pouvez le faire et cela produira l'effet souhaité.
Pour votre exemple particulier, vous avez besoin de FILE
déclarer dans < stdio.h > ;, il est donc bon de l'inclure.
Si le prototype parse_string () utilisait size_t
au lieu de unsigned int
et const char *
(pour un nom de fichier) au lieu de FILE *
, j'inclurais < stddef.h > dans le & "exemple.h &";
#ifndef EXAMPLE
#define EXAMPLE
#include <stddef.h> /* size_t typedef */
extern int parse_string(const char *filename, char const*, const size_t);
#endif