101 votes

Où mettre inclure des énoncés, en-tête ou de la source?

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?

132voto

schot Points 5809

Seulement mettre les inclut dans un en-tête l'en-tête lui-même a besoin d'eux.

Exemples:

  • Votre fonction retourne un type size_t. Ensuite, #include <stddef.h> dans l' en-tête de fichier.
  • Votre fonction utilise strlen. Ensuite, #include <string.h> dans le source du fichier.

27voto

Jerry Coffin Points 237758

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.

12voto

David Thornley Points 39051

Votre #includes 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 #includes, et les en-têtes, ils #include, et ainsi de suite jusqu'à la profondeur maximale. C'est pourquoi vous ne voulez pas superflu #includes 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

4voto

Vicky Points 6749

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.

3voto

rerun Points 15285

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X