cs_Nairos
Messages postés11Date d'inscriptionmardi 19 octobre 2010StatutMembreDernière intervention 7 janvier 2013
-
11 déc. 2012 à 11:59
cs_Nairos
Messages postés11Date d'inscriptionmardi 19 octobre 2010StatutMembreDernière intervention 7 janvier 2013
-
11 déc. 2012 à 16:32
Bonjour,
Comme vous le savez, la directive préprocesseur include engendre la copie d'un certain fichier au lieu d'appel. Ma question est la suivante : si je dispose de plusieurs fichiers sources (*.c) ; plutôt que de mettre à chaque début de fichier :
#include <stdio.h>
#include <stdlib.h>
N'est-il pas plus élégant de mettre ceci dans un header et d'inclure celui-ci au début des fichiers sources. Je sais bien que concrètement ça reviens au même, mais imaginez que j'inclue une dizaine de bibliothèques, au lieu d'avoir dix lignes au début de mes fichiers sources je n'en aurais qu'une.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 11 déc. 2012 à 13:16
Bonjour.
C'est une très bonne chose de se poser ce genre de questions. D'un point de vue propreté, il y a plusieurs écoles. De mon avis personnel, il faut tenter d'inclure toujours le strict nécessaire, dans la portée la moins grande possible.
En d'autre terme, mettre le maximum d'include dans les *.c si c'est possible, et le moins possible dans les headers. De plus, j'essaie toujours de mettre tous les headers nécessaires par fichier, afin qu'ils restent le plus autonomone possible. J'inclus souvent les headers systèmes après mes propres headers.
Je déconseille l'utilisation d'un header "fourre-tout", ou tu mets tous les headers de la terre entière pour être tranquille. L'écriture des headers, permet aussi de voir ce dont le fichier dépend, du premier coup d'oeil (ceux qui te reliront l'apprécieront :p)
#include "file.h" // Mes headers
#include <stdio.h> // Headers systèmes après mes headers
void print(const char* s)
{
printf("%s\n", s);
}
void print_struct(ma_struct obj)
{
printf("%i %b\n", obj.a, obj.b);
}
main.c
#include "file.h" // Mes headers
#include <stdio.h> // Headers systèmes après mes headers
// On évite de mettre <stdio.h> dans le header "file.h"
// Si on veut retirer file.h, ça évite de se demander pourquoi
// printf n'est plus reconnu dans le main. C'est le principe
// d'autonomie.
int main(void)
{
ma_struct obj;
obj.a = 1;
obj.b = 'b';
print("toto");
print_struct(obj);
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
cs_Nairos
Messages postés11Date d'inscriptionmardi 19 octobre 2010StatutMembreDernière intervention 7 janvier 2013 11 déc. 2012 à 15:07
Merci pour ton avis!
C'est vrai que d'un côté tu n'as pas tord le header devient un peu ce que tu qualifie de "fourre-tout". Y'a-t-il un intérêt à mettre les include de tes fichiers personnels avant les fichiers systèmes?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 11 déc. 2012 à 15:32
Y'a-t-il un intérêt à mettre les include de tes fichiers personnels avant les fichiers systèmes?
Je pensais que mon explication était claire, mais elle ne l'est pas :p
Oui. Ça évite de "polluer" tes headers et d'oublier ainsi de mettre des headers systèmes.
Ex:
toto.h
// oublie du header <stdio.h>
void print(void) { printf("bonjour\n"); }
main.c
#include <stdio.h>
#include "toto.h" // Pas d'erreur, coup de chance qu'il y ait stdio avant
main.c
#include "toto.h" // Erreur: on voit qu'il manque un include dans toto.h
#include <stdio.h>
En mettant toujours mes headers avant les headers systèmes, je réduits les chances d'oublier des mettres des headers systèmes dans mes headers.
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question