Visualizzazione della gerarchia #include per un file C ++ in Visual Studio


169

Problema: ho un grande progetto Visual C ++ che sto provando a migrare a Visual Studio 2010. È un enorme mix di cose da varie fonti e di varie età. Sto riscontrando problemi perché qualcosa include entrambi winsock.he winsock2.h.

Domanda: quali strumenti e tecniche sono disponibili per visualizzare la #includegerarchia per un file sorgente di Visual Studio C ++?

So cl /Pper ottenere l'output del preprocessore, ma questo non mostra chiaramente quale file include quali altri file (e in questo caso l' /Poutput è lungo 376.932 righe Cool)

In un mondo perfetto mi piacerebbe una visualizzazione gerarchica di quali file includono quali altri file, insieme ai numeri di riga in modo da poter saltare ai sorgenti:

source.cpp(1)
  windows.h(100)
    winsock.h
  some_other_thing.h(1234)
    winsock2.h

2
Per le persone che cercano una soluzione GCC / Clang, utilizzare gcc -H -fsyntax-only ...per generare la gerarchia. I crediti verso stackoverflow.com/a/18593344/427545
Lekensteyn

Risposte:


234

C'è un'impostazione:

Impostazioni progetto -> Proprietà di configurazione -> C / C ++ -> Avanzate -> Mostra include

che genererà l'albero. Si associa allo switch / showIncludes del compilatore


20
Nota: la gerarchia è visibile nella finestra Output.
CannibalSmith,

3
Se qualcuno di interessati: anche se si seleziona la Clang piattaforma di set di strumenti , si può ancora "spettacolo comprende" se si aggiunge -HinC/C++ -> Command Line - Additional Options
WIP

3
Ancora non buono come la funzione "incluso da" di gcc, che mostra la gerarchia di inclusione diretta relativa a un errore di compilazione e che mostra anche i numeri di riga.
Paolo,

2
Ho creato una regex rapida che elimina Visual Studio (qualsiasi cosa in Programmi (x86)). Puoi copiare + incollare la finestra di output in un'app come Notepad ++ ed eseguire un regex per trovare e sostituire con lo spazio vuoto per 1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
rimuovere

2
Si noti che mentre / showIncludes può essere attivato / disattivato per un singolo file di origine, non avrà alcun effetto a meno che / showIncludes non sia impostato a livello di progetto.
David Carr,

20

Il compilatore supporta anche un parametro / showIncludes: non ti dà numeri di riga, ma può dare una visione abbastanza completa di quali include provengono da dove.

È in Impostazioni progetto -> Proprietà di configurazione -> C / C ++ -> Avanzate -> Mostra include.


+1 Mille grazie! (Ma temo che xtofl ottenga l'Accettazione per essere più veloce).
RichieHindle,

17

Abbiamo trovato IncludeManager come uno strumento molto potente. Non è gratuito (ma non costoso) e ci ha permesso di comprendere i nostri problemi di inclusione e di ridurre i tempi di compilazione da 50 minuti a 8 minuti eliminando grossi blocchi di inclusioni che non utilizzavamo.


5
Yow! Ho eseguito IncludeManager sul file offensivo e ha prodotto un grafico che mi ha fatto ridere ad alta voce. Secondo i miei calcoli avrei bisogno di un monitor da 400 "per vedere tutto. Penso che siamo al di là del suo potere di aiutare.
Cool

2
Aggiornamento: la società madre di IncludeManager, ProFactor (www.profactor.co.uk) ha cessato l'attività, ma sta fornendo le sue versioni più recenti gratuitamente dal sito Web sopra. Il rovescio della medaglia è che funziona solo su versioni complete di Visual Studio da VS2005 a VS2013.
Dana,

5

Non buono quanto la funzione di inclusione gerarchica di gcc, che mostra la gerarchia di inclusione della linea diretta in caso di errore. L'opzione "mostra include" in VS mostra tutto, il che è eccessivo quando si esegue il debug di file gerarchici con problemi di file.


Lo aspetto già da 5 anni, che ho usato con Mingw.
fantastico

2
Forse aggiungere alcuni dettagli su come usarlo, dove si trova la documentazione ecc.? Questa risposta non aggiunge molto al momento.
Sam Brightman,

4

Ecco un buon strumento FOSS di terze parti. Puoi esportare i risultati in XML, che includerà i dati sul numero di occorrenze e sui numeri di riga.


4

Ora esiste un plug-in per Visual Studio chiamato IncludeToolbox . Può elencare le inclusioni dipendenti e fare più cose come una rimozione e compilazione casuali per vedere se tale inclusione era richiesta.



2

cl / P dovrebbe mostrarti i numeri di riga, in modo che tu possa dire il contesto da cui viene incluso un file di intestazione.

Se fai fuori le righe con ...

grep "^ # line" file.i

... quindi dovresti avere un'indicazione abbastanza chiara di quali file sono stati rilevati in ordine dal preprocessore.

Se si tratta di un incidente una tantum, questa dovrebbe essere una diagnosi piuttosto rapida.


2
Certo, ma questo mi dà ottomila righe di output non strutturato, senza gerarchia.
RichieHindle,

Ho esaminato l'output cl / P per un tempo abbastanza lungo e mi chiedevo se esistesse uno strumento migliore per il lavoro. Ora ho scoperto che c'è, il che è fantastico. La domanda è generale e le risposte saranno qui su SO per sempre, per gli altri a trovare.
RichieHindle,

0

Uso Doxygen e GraphViz .

inserisci qui la descrizione dell'immagine

Installa entrambi. Assicurati di selezionare GraphViz come strumento per generare i diagrammi della gerarchia. Seleziona "Usa lo strumento punto dal pacchetto GraphVix".

Assicurati anche di includere la directory binaria di GraphViz nella variabile di ambiente PATH.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.