#include dans un header [Résolu]

Signaler
Messages postés
11
Date d'inscription
mardi 19 octobre 2010
Statut
Membre
Dernière intervention
7 janvier 2013
-
Messages postés
11
Date d'inscription
mardi 19 octobre 2010
Statut
Membre
Dernière intervention
7 janvier 2013
-
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.

Alors, plus élégant ou pas?

4 réponses

Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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)

Je te fais un petit exemple:
ma_struct.h
#ifndef MA_STRUCT_H_
# define MA_STRUCT_H_

typedef struct
{
  int a;
  char b;
} ma_struct;

#endif /* !MA_STRUCT_H_ */


file.h
#ifndef FILE_H_
# define FILE_H_

# include "ma_struct.h"

void print(const char* s);
void print_struct(ma_struct obj);

#endif /* !FILE_H_ */


file.c
#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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
11
Date d'inscription
mardi 19 octobre 2010
Statut
Membre
Dernière intervention
7 janvier 2013

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?
Messages postés
3819
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 septembre 2020
113
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
11
Date d'inscription
mardi 19 octobre 2010
Statut
Membre
Dernière intervention
7 janvier 2013

Je vois! Merci grandement de ton aide, ces petits détails me taraudaient!
Cordialement,
N.