Wyświetlanie hierarchii #include dla pliku C ++ w programie Visual Studio


169

Problem: Mam duży projekt Visual C ++, który próbuję przenieść do Visual Studio 2010. Jest to ogromna mieszanka materiałów pochodzących z różnych źródeł iw różnym wieku. Mam problemy, ponieważ coś obejmuje oba elementy winsock.hi winsock2.h.

Pytanie: Jakie narzędzia i techniki są dostępne do wyświetlania #includehierarchii dla pliku źródłowego programu Visual Studio C ++?

Wiem o tym, jak cl /Puzyskać dane wyjściowe preprocesora, ale to nie pokazuje jasno, który plik zawiera inne pliki (w tym przypadku /Pwynik ma długość 376,932 linii 8-)

W idealnym świecie chciałbym hierarchicznie wyświetlić, które pliki zawierają inne pliki, wraz z numerami wierszy, abym mógł przeskoczyć do źródeł:

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

2
W przypadku osób, które szukają rozwiązania GCC / Clang, użyj gcc -H -fsyntax-only ...do wyprowadzenia hierarchii. Kredyty na stackoverflow.com/a/18593344/427545
Lekensteyn

Odpowiedzi:


234

Jest ustawienie:

Ustawienia projektu -> Właściwości konfiguracji -> C / C ++ -> Zaawansowane -> Pokaż zawiera

które wygeneruje drzewo. Mapuje do przełącznika kompilatora / showIncludes


20
Uwaga: hierarchię można zobaczyć w oknie Wyjście.
CannibalSmith

3
Jeśli ktoś jest zainteresowany: nawet jeśli wybierzesz dzyń platformy zestaw narzędzi , nadal można „pokazują obejmuje” jeśli dodać -HwC/C++ -> Command Line - Additional Options
WIP

3
Wciąż nie jest tak dobra, jak funkcja „zawarta z” gcc, która pokazuje bezpośrednią hierarchię dołączeń związaną z błędem kompilacji, a także wyświetla numery wierszy.
Paul,

2
Zrobiłem szybkie wyrażenie regularne, które usuwa zawartość Visual Studio (wszystko w Program Files (x86)). Można kopiować + wklej okno wyjściowe do aplikacji takich jak Notepad ++ i zrobić znajdowania regex i zastąpić zaślepką rozebrać wszystko VS zawiera z drzewa:1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
kjhf

2
Zauważ, że chociaż / showIncludes może być przełączane dla pojedynczego pliku źródłowego, nie będzie to miało żadnego efektu, chyba że / showIncludes jest ustawiony na poziomie projektu.
David Carr

20

Kompilator obsługuje również przełącznik / showIncludes - nie podaje numerów linii, ale może dać dość obszerny widok, z którego w tym miejscu pochodzi.

Znajduje się w obszarze Ustawienia projektu -> Właściwości konfiguracji -> C / C ++ -> Zaawansowane -> Pokaż zawiera.


+1 Wielkie dzięki! (Ale obawiam się, że xtofl otrzymuje akceptację, ponieważ jest szybszy).
RichieHindle,

17

Odkryliśmy, że IncludeManager jest bardzo potężnym narzędziem. Nie jest darmowy (ale niedrogi) i pozwolił nam opanować nasze problemy Uwzględnij i skrócić czas kompilacji z 50 do 8 minut, usuwając duże fragmenty dołączeń, których nie używaliśmy.


5
Yow! Uruchomiłem IncludeManager na naruszającym plik pliku i wygenerowałem wykres, który rozśmieszył mnie. Według moich obliczeń potrzebowałbym monitora 400 ", aby zobaczyć całość. Myślę, że nie jesteśmy w stanie pomóc. 8-)
RichieHindle

2
Aktualizacja - firma macierzysta IncludeManager, ProFactor (www.profactor.co.uk) zaprzestała działalności, ale udostępnia swoje najnowsze wersje bezpłatnie z powyższej witryny internetowej. Wadą jest to, że działa tylko w pełnych wersjach programu Visual Studio od VS2005 do VS2013.
Dana

5

Nie tak dobre, jak funkcja hierarchicznego dołączania gcc, która pokazuje hierarchię dołączania w wierszu bezpośrednim w przypadku błędu. Opcja „pokaż zawiera” w VS pokazuje wszystko, co jest przesadą podczas debugowania hierarchicznych problemów z plikami dołączania.


Czekam na to już od 5 lat, z których korzystałem z mingw.
fantastyczny

2
Może dodać trochę szczegółów, jak z niego korzystać, gdzie jest dokumentacja itp.? Ta odpowiedź obecnie niewiele dodaje.
Sam Brightman

4

Oto dobre narzędzie firmy FOSS. Możesz wyeksportować wyniki do XML, który będzie zawierał dane o liczbie wystąpień i numerach wierszy.


4

Istnieje teraz wtyczka dla programu Visual Studio o nazwie IncludeToolbox . Może wyświetlać listę zależnych dołączeń i wykonywać więcej rzeczy, takich jak losowe usuwanie i kompilowanie, aby sprawdzić, czy to dołączenie było wymagane.



2

cl / P powinien pokazywać numery wierszy, tak abyś mógł określić kontekst, z którego jest dołączany plik nagłówkowy.

Jeśli wygrasz linie za pomocą ...

grep "^ # line" file.i

... wtedy powinieneś mieć całkiem wyraźne wskazanie, które pliki zostały napotkane w kolejności przez preprocesor.

Jeśli jest to jednorazowy incydent, powinna to być dość szybka diagnostyka.


2
Jasne, ale to daje mi osiem tysięcy wierszy nieustrukturyzowanych wyników, bez hierarchii.
RichieHindle,

Przeglądałem dane wyjściowe cl / P wystarczająco długo i zastanawiałem się, czy istnieje lepsze narzędzie do tego zadania. Teraz odkryłem, że jest, co jest świetne. Pytanie jest ogólne, a odpowiedzi będą zawsze na SO, aby inni mogli je znaleźć.
RichieHindle,

0

Używam Doxygen i GraphViz .

wprowadź opis obrazu tutaj

Zainstaluj oba. Pamiętaj, aby wybrać GraphViz jako narzędzie do generowania diagramów hierarchii. Wybierz „Użyj narzędzia kropkowego z pakietu GraphVix”.

Upewnij się również, że dołączyłeś katalog binarny z GraphViz do zmiennej środowiskowej PATH.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.