Est-ce une bonne idée de mettre tous vos includes dans un seul fichier d’en-tête?

Quelle est la meilleure pratique pour C ce que vous mettez dans un fichier d’en-tête C?

Est-il utile de mettre tous les inclus utilisés pour un programme sur plusieurs fichiers source dans un seul fichier d’en-tête?

Qu’en est-il des inclus qui sont utilisés dans pratiquement tous les fichiers (c’est-à-dire stdio.h)?

Non, il ajoute simplement cruellement et frais généraux.

En tant que responsable technique, l’un des plus gros problèmes que vous devrez affronter consiste à déterminer quels en têtes n’ont pas besoin d’être inclus et s’en débarrasser. Lorsque vous obtenez une liste de plus de 20 en-têtes, vous commencez à contempler des choses laides telles que le forçage brutal (supprimer un à la fois et voir s’il se casse quelque chose).

Soyez gentil avec les gens qui doivent entretenir vos affaires à l’avenir. Utilisez les en-têtes dont vous avez besoin par module, pas plus .. pas moins 🙂

Personnellement, je souscris à une philosophie du “mettez-le là où vous l’utilisez”. Il est beaucoup plus clair de savoir quels fichiers utilisent quoi, où sont les dépendances, etc.

Imaginez que vous avez un en-tête MyHeader.h . Si vous apportez une modification nécessitant une modification du code qui en dépend, il est facile de trouver ce code dépendant si chaque fichier qui l’utilise possède un #include "MyHeader.h" – vous pouvez simplement effectuer une recherche globale de l’instruction include. .

Si par contre vous n’incluez que MyHeader.h dans un autre en-tête MyHugeHeader.h , puis l’inclure dans vos fichiers, vous ne pouvez pas faire la même chose, car tout ce qui se trouve dans les fichiers qui utilisent MyHeader.h est #include "MyHugeHeader.h" , identique à tous les autres fichiers.

Mettre tous les en-têtes possibles dans une en-tête d’application est aussi faux que possible.

C’est de la paresse qui a un prix avantageux. Cela rend les constructions fragiles. Il est difficile de comprendre où sont les vraies dépendances, et donc de refactoriser ou de réutiliser du code.

Cela rend difficile le test.

Mais le plus gros problème est qu’il représente la paresse intellectuelle et encourage la même chose.

Comme pour tous les problèmes de programmation, faites ce qui est nécessaire, ni plus, ni moins. Pensez à la maintenance. Pensez à la gestion de la construction.

Il suffit de penser.

Quelques points non signalés:

  • les dépendances inutiles ajoutent au temps de compilation. Lorsque vous modifiez un en-tête, vous devez recomstackr toutes les unités de compilation qui l’incluent directement ou indirectement. Si l’inclusion n’est pas nécessaire, la recompilation ne l’est pas non plus. Plus le programme est volumineux, plus le problème sera grave, en particulier si vous avez décomposé vos programmes en composants dont la recompilation doit être déclenchée manuellement.

  • les en-têtes de pré-compilateur peuvent être plus efficaces lorsque vous ajoutez des dépendances inutiles.

Préférence personnelle vraiment … Peu importe la façon dont il est formaté tant que vous êtes cohérent (ce qui le rend facile à lire). Vous pouvez tout mettre dans 1 fichier d’en-tête ou simplement dans tous les fichiers qui en ont besoin. Cela dépend également de la façon dont les autres inclus sont chargés, tout ce qui vient après que le principal ne nécessite pas son inclus, etc.: utiliser le même fichier d’en-tête pour TOUS vos autres fichiers C peut ou non (dépend du compilateur) inclure le même inclure plusieurs fois.

Edit: je suis également d’accord avec Mac, le mettre là où vous l’utilisez est une très, très belle chose à faire aussi

Je ne mettrais pas volontairement tous mes inclus dans un seul fichier d’en-tête, simplement parce que si vous modifiez l’un de ces fichiers d’en-tête inclus, vous devrez recomstackr tout ce qui a inclus votre fichier d’inclusion “maître”. Cela peut entraîner des temps de compilation inutilement longs pour un changement de ligne unique.

Cela dit, je ne prendrais pas trop de temps pour faire en sorte de ne pas être trop libéral avec les déclarations include. Certains ingénieurs vont passer beaucoup de temps à essayer de réduire les fichiers includes pour gagner du temps de compilation, et je pense que leur temps est mieux servi pour résoudre des problèmes ou travailler sur de nouvelles fonctionnalités.

Un fichier d’en-tête est en fait ce que vous incluez de votre programme c. Il contient des structures de données telles que des structures, des macros, des définitions de fonctions, etc. Parfois, un seul fichier d’en-tête peut être correct. Si votre programme se développe en composants logiques, vous aurez peut-être besoin de plus.