365 votes

Détecter les #includes superflus en C/C++ ?

Je constate souvent que la section des en-têtes d'un fichier devient de plus en plus grande, mais qu'elle ne se réduit jamais. Tout au long de la vie d'un fichier source, les classes peuvent avoir été déplacées et remaniées, et il est très possible qu'il y ait un certain nombre d'en-têtes dans le fichier. #includes qui n'ont pas besoin d'être là et plus. Les laisser là ne fait que prolonger le temps de compilation et ajoute des dépendances de compilation inutiles. Essayer de déterminer lesquelles sont encore nécessaires peut être assez fastidieux.

Existe-t-il un outil capable de détecter les directives #include superflues et de suggérer celles que je peux supprimer sans risque ?
Est-ce que les peluches font ça peut-être ?

2 votes

2 votes

La question liée ne semble aborder le problème que sous Windows, en utilisant Visual Studio en particulier.

8 votes

Je vote pour rouvrir cette question, car le doublon concerne l'utilisation de Visual Studio, spécifiquement.

202voto

Josh Kelley Points 24438

Cppclean de Google (liens vers : télécharger , documentation ) peut trouver plusieurs catégories de problèmes C++, et il peut maintenant trouver les #includes superflus.

Il existe également un outil basé sur Clang, incluez ce que vous voulez include-what-you-use peut même suggérer des déclarations en avant (afin que vous n'ayez pas à #inclure autant) et éventuellement nettoyer vos #includes pour vous.

Les versions actuelles de Eclipse CDT ont également cette fonctionnalité intégrée : en allant sous le menu Source et en cliquant sur Organize Includes, vous classerez vos #include par ordre alphabétique, ajouterez tous les en-têtes qu'Eclipse pense que vous utilisez sans les inclure directement, et commentera tous les en-têtes dont il pense que vous n'avez pas besoin. Cette fonctionnalité n'est cependant pas fiable à 100%.

2 votes

C'est le cas maintenant. Je viens de commencer à l'utiliser. Voir ma note ici. stackoverflow.com/questions/1301850/

0 votes

Je viens de commencer à utiliser Clang aussi. Je pense que je l'aime encore plus.

1 votes

Le dépôt cppclean a été supprimé, vous pouvez maintenant l'obtenir ici : bitbucket.org/robertmassaioli/cppclean (le site original est toujours utile pour certains exemples d'utilisation).

77voto

Tzafrir Points 557

Consultez également incluez ce que vous voulez qui résout un problème similaire.

6 votes

À mon avis, cette réponse doit recevoir beaucoup plus de votes positifs, car une fois les problèmes résolus, l'outil IWYU de Google sera l'outil définitif pour cette tâche.

7 votes

Sudo apt-get install iwyu

0 votes

Il semble très bien - avec deux réserves : 1) la dernière mise à jour date de février 2106 ; 2) Gogole lui-même ne l'utilise que pour le C++, et non le C, ce que l'OP a demandé.

43voto

Ce n'est pas automatique, mais doxygen produira des diagrammes de dépendances pour #included fichiers. Vous devrez les parcourir visuellement, mais ils peuvent être très utiles pour se faire une idée de ce qui utilise quoi.

30voto

JaredPar Points 333733

Le problème de la détection des includes superflus est qu'il ne peut s'agir d'un simple vérificateur de dépendance de type. Un include superflu est un fichier qui n'apporte rien de valable à la compilation. y ne modifie pas un autre élément dont dépendent d'autres fichiers. Il existe de nombreuses façons dont un fichier d'en-tête peut modifier une compilation, par exemple en définissant une constante, en redéfinissant et/ou en supprimant une macro utilisée, en ajoutant un espace de noms qui modifie la recherche d'un nom à un moment donné. Pour détecter des éléments tels que l'espace de noms, il faut bien plus qu'un préprocesseur, il faut en fait presque un compilateur complet.

Lint est plus un vérificateur de style et n'aura certainement pas cette capacité complète.

Je pense que vous trouverez que le seul moyen de détecter une inclusion superflue est de la supprimer, de compiler et d'exécuter les suites.

9 votes

Tout cela ne posera pas de problème si les fichiers d'inclusion sont bien disposés. Si vous devez inclure le fichier A avant le fichier B, vous vous y prenez mal (et j'ai travaillé sur des projets où ils s'y prenaient mal).

13 votes

@David, oui mais cela dépend des années de devs avant vous qui le font correctement. Je peux dire avec une grande certitude que les chances que cela se produise favorisent la maison, pas vous :(

0 votes

Oui, mais je m'en aperçois généralement en modifiant un programme, et je me retrouve soudain avec une erreur de compilation (si j'ai de la chance) ou un bug obscur. Cela semble garder les fichiers #include honnêtes, du moins à long terme.

14voto

itsmatt Points 18905

Je pensais que PCLint le ferait, mais cela fait quelques années que je ne l'ai pas regardé. Vous pourriez y jeter un coup d'oeil.

J'ai regardé ce blog et l'auteur a parlé un peu de la configuration de PCLint pour trouver les includes inutilisés. Cela peut valoir la peine d'y jeter un coup d'œil.

0 votes

Bonne trouvaille ! Je vais devoir l'utiliser.

5 votes

J'utilise PCLint régulièrement et il me signale les en-têtes inutilisés. Je prends soin de commenter l'en-tête #include et de recompiler pour être sûr que l'en-tête est vraiment inutilisé...

0 votes

Merci pour la confirmation, Harold.

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