11
votes

Identifier quel fichier a inclus un fichier d'en-tête particulier

Parfois avec une structure d'en-tête complexe, il se produit une partie d'en-tête est incluse, mais il est difficile de dire d'où allez.

Y a-t-il un peu d'outil (Viewer Depedency?) ou une méthode Comment trouver la "pile d'inclusion" (quelle source / quel en-tête / quel en-tête / ...) comprend un fichier d'en-tête particulier?

Si le fichier d'en-tête est inclus plusieurs fois, la recherche d'une première inclusion est suffisante, la recherche de toutes les inclusions est un bonus de bienvenue.


4 commentaires

Grep ne suffit pas, à cause des inclusions indirectes (c'est ce que je voulais dire par une structure d'en-tête complexe, je devrais peut-être être plus claire).


Ou utilisez un référenceur croisé (AKA 'GREP sur les stéroïdes') tels que OpenGrok . Bien que cela ne vous aide toujours pas à trouver des inclusions indirectes.


DOXYGEN peut produire des graphiques, mais il peut être assez lent pour analyser de très grandes grosses basses basses.


@Neil: grep n'aidera pas avec les en-têtes que #include autres en-têtes. Et s'il y a une inclusion conditionnelle, appelez à nouveau Grep sur les résultats du premier GREP ne donnera pas de résultats utiles.


4 Réponses :


6
votes

Une approche un peu haçonneuse (mais qui devrait fonctionner sur n'importe quelle plate-forme / boîte à outils, sans avoir besoin d'un analyseur de dépendance distinct) est simplement d'ajouter un #Error en haut de l'en-tête inclus - vous allez Ensuite, obtenez une erreur de compilation à partir du premier fichier .cpp qui y comprend.


2 commentaires

Nice et "portable" (pas d'outils spéciaux nécessaires) idée. Un inconvénient est des en-têtes (par exemple les bibliothèques standard) ne peut être lu que pour vous ou les toucher peut entraîner une reconstruction excessive à la suite d'une utilisation fréquente.


@Suma: Si vous souhaitez éviter de modifier un en-tête standard, placez votre propre copie temporaire avec #Error ajouté tôt sur le chemin Inclure.



8
votes

L'en-tête que vous recherchez peut ne pas être directement inclus dans le fichier source. Vous devez "préprocéder_only" le code. Cela peut être fait en G ++ en utilisant l'option -E; Je n'en sais pas assez sur Visual C pour savoir quelle est la spécification exacte, mais si vous regardez dans l'aide pour «Preprocess», vous pouvez trouver quelque chose.


0 commentaires

12
votes

Quelqu'un a posté à ce sujet mais je ne trouve pas cette réponse. Donc, en VS, allez à vos propriétés de votre projet. Choisissez Propriétés de configuration / C / C ++ / Advanced / Afficher inclut et définissez «Oui».

Compilez ensuite votre fichier CPP. Cela ressemble à ceci: Fichier CPP: P>

1>------ Build started: Project: stlport_project, Configuration: Release Win32 ------
1>Compiling...
1>stlport_project.cpp
1>Note: including file: D:\src\hrs_rt_059.00\HRS\modules\src\libs\src\external\stlport\5.1.7\stdio.h
1>Note: including file:  D:\src\hrs_rt_059.00\HRS\modules\src\libs\src\external\stlport\5.1.7\stl/_prolog.h
1>Note: including file:   D:\src\hrs_rt_059.00\HRS\modules\src\libs\src\external\stlport\5.1.7\stl/config/features.h


2 commentaires

g ++ -m stlport_project.cpp . Vérifie ça.


@Sergeikurenkov avez-vous une idée de la façon de faire la même chose à QtCreator?



1
votes

Visual Studio / Showincludes

Directement dans le Visual Studio J'ai trouvé une option appelée / showinclLUes - La sortie est textuelle uniquement, mais en retrait d'une manière qui rend la lecture assez facile: p>

Note: including file: /*..path.anonymized..*/\TCMalloc\windows\config.h
Note: including file:  /*..path.anonymized..*/\memalloc\tcmalloc\windows/port.h
Note: including file:   C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\windows.h
Note: including file:    C:\Program Files\Microsoft Visual Studio 8\VC\include\excpt.h
Note: including file:     C:\Program Files\Microsoft Visual Studio 8\VC\include\crtdefs.h
Note: including file:      C:\Program Files\Microsoft Visual Studio 8\VC\include\sal.h
Note: including file:      C:\Program Files\Microsoft Visual Studio 8\VC\include\vadefs.h
Note: including file:    C:\Program Files\Microsoft Visual Studio 8\VC\include\stdarg.h
Note: including file:    C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\windef.h
Note: including file:     C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\winnt.h
Note: including file:      C:\Program Files\Microsoft Visual Studio 8\VC\include\ctype.h
Note: including file:       C:\Program Files\Microsoft Visual Studio 8\VC\include\crtdefs.h


0 commentaires