Dois-je mettre de l'inclut dans le fichier d'en-tête ou le fichier source? Si le fichier d'en-tête contient l'inclure des énoncés, alors si je comprend que le fichier d'en-tête dans ma source, mon fichier source disposez de tous les fichiers qui étaient dans ma tête? Ou devrais-je inclure dans mon fichier source?
Réponses
Trop de publicités?Il y a été tout à fait un peu de désaccord sur ce fil des ans. À un moment, il était de tradition qu'un en-tête uniquement de déclarer ce qui était dans quel module est liée à la, donc de nombreux en-têtes avaient des exigences spécifiques que vous #include
d'un certain ensemble d'en-têtes (dans un ordre précis). Certains extrêmement traditionnelle de programmeurs C toujours suivre ce modèle (religieusement, dans certains cas au moins).
Plus récemment, il y a un mouvement vers la plupart des en-têtes autonome. Si cet en-tête a besoin d'autre chose, l'en-tête lui-même des poignées qui, en s'assurant que tout ce dont elle a besoin est inclus (dans l'ordre correct, si il y a commande de questions). Personnellement, je préfère ce, surtout lorsque l'ordre des en-têtes peut être important, il permet de résoudre le problème une fois, au lieu de demander à tout le monde qui l'utilise pour résoudre le problème encore une fois.
Notez que la plupart des en-têtes ne doit contenir que des déclarations. Cela signifie l'ajout d'un inutile d'en-tête ne devriez pas (normalement) avoir un effet sur votre exécutable final. Le pire de ce qui se passe, c'est qu'il ralentit compilation un peu.
Votre #include
s doit être de fichiers d'en-tête, et chaque fichier (source ou en-tête) devrait #include
l'en-tête des fichiers dont il a besoin. Fichiers d'en-tête devrait #include
le minimum de fichiers d'en-tête nécessaires, et les fichiers sources doivent également, si ce n'est pas aussi important pour les fichiers source.
Le fichier source sera les en-têtes de il #include
s, et les en-têtes, ils #include
, et ainsi de suite jusqu'à la profondeur maximale. C'est pourquoi vous ne voulez pas superflu #include
s dans les fichiers d'en-tête: ils peuvent provoquer un fichier source à inclure un grand nombre de fichiers d'en-tête, il peut ne pas avoir besoin, du ralentissement de la compilation.
Cela signifie qu'il est tout à fait possible que les fichiers d'en-tête peut être inclus deux fois, et qui peut être un problème. La méthode traditionnelle consiste à mettre "inclure les gardes" dans les fichiers d'en-tête, comme pour ce fichier foo.h:
#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H
/* everything in header goes here */
#endif
Si le fichier d'en-tête #includes
fichiers d'en-tête B et C, puis chaque fichier source #includes
- il également obtenir B et C #included
. Le pré-processeur littéralement effectue simplement le texte de substitution: partout où il trouve le texte dit - #include <foo.h>
il le remplace par le texte de l' foo.h
le fichier.
Il existe différentes opinions sur si vous devez mettre #includes
dans les en-têtes ou les fichiers source. Personnellement, je préfère les mettre tous #includes
en source de fichier par défaut, mais tous les fichiers d'en-tête ne peut pas compiler sans autre pré-requis en-têtes doivent #include
ces en-têtes eux-mêmes.
Et chaque fichier d'en-tête doit contenir un include de la garde pour l'empêcher d'être inclus plusieurs fois.
Faire de tous vos fichiers de sorte qu'ils peuvent être construits en utilisant uniquement ce qu'ils comprennent. Si vous n'avez pas besoin d'inclure dans votre en-tête de l'enlever. Dans un grand projet si vous n'avez pas maintenir cette discipline vous laissez-vous ouvrir à la rupture de toute une génération, lorsque quelqu'un supprime un include d'un fichier d'en-tête qui est utilisé par un consommateur de ce fichier, et même pas par la tête.