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

Problema: ho un progetto di Visual C ++ di grandi dimensioni che sto cercando di migrare a Visual Studio 2010. È un enorme mix di materiale proveniente da varie fonti e di varie età. Sto avendo problemi perché qualcosa include sia winsock.h che winsock2.h .

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

So di cl /P per ottenere l’output del preprocessore, ma ciò non mostra chiaramente quale file include quali altri file (e in questo caso l’output /P è 376.932 linee lungo 😎

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 accedere alle fonti:

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

C’è un’impostazione:

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

che genererà l’albero. Si associa al commutatore switch / showInclude

Il compilatore supporta anche uno switch / showInclude: non fornisce i numeri di linea, ma può fornire una vista abbastanza completa di cui include provengono da dove.

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

Abbiamo trovato IncludeManager per essere uno strumento molto potente. Non è gratuito (ma non costoso) e ci ha permesso di prendere confidenza con i nostri problemi Includi e di ridurre i tempi di compilazione da 50 minuti a 8 minuti eliminando grossi pezzi di inclusioni che non stavamo utilizzando.

Non buono come la funzione di inclusione gerarchica di gcc, che mostra la gerarchia di inclusione diretta nel caso di un errore. L’opzione “mostra include” in VS mostra tutto, che è eccessivo quando il debug dei problemi di file include gerarchico.

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

Prova a redhat Source-Navigator per una soluzione più grafica .

cl / P dovrebbe mostrare i numeri di riga, in modo tale da poter indicare il contesto da cui viene incluso un file di intestazione.

Se togli le linee con …

grep “^ # line” file.i

… allora dovresti avere un’indicazione abbastanza chiara di quali file sono stati rilevati in ordine dal preprocessore.

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

Ora c’è un plugin per Visual Studio chiamato IncludeToolbox . Può elencare le inclusioni dipendenti e fare più cose come una rimozione e una compilazione casuali per vedere se tale inclusione fosse richiesta.