C: Inclusioni all'interno delle intestazioni
-
05-07-2019 - |
Domanda
Se ho il seguente:
/*
* example.h
*/
#ifndef EXAMPLE
#define EXAMPLE
#include <stdio.h>
extern int parse_string(FILE *, char const*, const unsigned int);
#endif
Questo significa che il codice che utilizza ... #include example.h
... non dovrà ... #include <stdio.h>
dipendenze di? (ad esempio: <=>)
Soluzione
Corretto: ecco perché è buona norma limitare le intestazioni necessarie incluse in altre intestazioni. Il preprocessore sostituirà il & Quot; #include & Quot; direttiva con i contenuti di stdio.h, quindi la tua intestazione sarà simile al compilatore:
/*
* example.h
*/
#ifndef EXAMPLE
#define EXAMPLE
<contents of stdio.h>
extern int parse_string(FILE *, char const*, const unsigned int);
#endif
Altri suggerimenti
Si
Ma se il codice dipende da <stdio>
, probabilmente dovrebbe includerlo. (Dopotutto, <=> ha anche una protezione da inclusione multipla.)
Se quello che vuoi è un master includi per il tuo progetto, vai avanti e creane uno, ma includilo sia nelle intestazioni effettive che nelle intestazioni di sistema comuni, ma senza prototipi, dichiarazioni o macro. Cioè, avere il mega include non fa altro che include. In questo modo i singoli moduli possono prendere le proprie decisioni in linea con l'evoluzione del programma.
Sì, puoi farlo e avrà l'effetto desiderato.
Per il tuo esempio particolare devi FILE
dichiarare in < stdio.h > ;, quindi è bene includerlo.
Se il prototipo parse_string () utilizzava size_t
invece di unsigned int
e const char *
(per un nome file) anziché FILE *
, includevo < stddef.h > nel " esempio.h "
#ifndef EXAMPLE
#define EXAMPLE
#include <stddef.h> /* size_t typedef */
extern int parse_string(const char *filename, char const*, const size_t);
#endif