Отображение иерархии #include для файла C ++ в Visual Studio


169

Проблема: у меня есть большой проект Visual C ++, который я пытаюсь перенести в Visual Studio 2010. Это огромный набор материалов из разных источников и разных возрастов. У меня проблемы, потому что что-то включает и то winsock.hи другое winsock2.h.

Вопрос: Какие существуют инструменты и методы для отображения #includeиерархии исходного файла Visual Studio C ++?

Я знаю о том, cl /Pкак получить вывод препроцессора, но это не ясно показывает, какой файл включает какие другие файлы (и в этом случае /Pвывод составляет 376 932 строки 8-)

В идеальном мире мне бы хотелось, чтобы иерархически отображалось, какие файлы включают какие другие файлы, а также номера строк, чтобы я мог перейти к источникам:

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

2
Для людей, которые ищут решение GCC / Clang, используйте gcc -H -fsyntax-only ...для вывода иерархии. Кредиты для stackoverflow.com/a/18593344/427545
Лекенштейн

Ответы:


234

Есть настройка:

Настройки проекта -> Свойства конфигурации -> C / C ++ -> Дополнительно -> Показать включает

это сгенерирует дерево. Он сопоставляется с переключателем компилятора / showIncludes


20
Примечание: иерархию можно увидеть в окне вывода.
CannibalSmith

3
Если кто -то заинтересован: даже если вы выбираете Clang платформы набор инструментов , вы можете «шоу включает в себя» , если вы добавите -HвC/C++ -> Command Line - Additional Options
WIP

3
По-прежнему не так хорошо, как функция gcc «включена из», которая показывает иерархию прямого включения, связанную с ошибкой во время компиляции, и которая также отображает номера строк.
Пол

2
Я сделал быстрое регулярное выражение, которое исключает Visual Studio (все, что находится в Program Files (x86)). Вы можете скопировать + вставить окно вывода в приложение, такое как Notepad ++, и найти и заменить регулярное выражение пустым, чтобы 1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
убрать

2
Обратите внимание, что хотя / showInclude можно переключать для отдельного исходного файла, это не будет иметь никакого эффекта, если / showInclude не установлено на уровне проекта.
Дэвид Карр

20

Компилятор также поддерживает ключ / showInclude - он не дает вам номера строк, но может дать довольно полное представление о том, что включает в себя откуда.

Он находится в разделе «Настройки проекта» -> «Свойства конфигурации» -> «C / C ++» -> «Дополнительно» -> «Показать».


+1 Большое спасибо! (Но я боюсь, что xtofl получит согласие на то, чтобы быть быстрее).
RichieHindle

17

Мы обнаружили, что IncludeManager является очень мощным инструментом. Это не бесплатно (но не дорого), и это позволило нам получить представление о проблемах включения и сократить время компиляции с 50 до 8 минут, исключив большие фрагменты включений, которые мы не использовали.


5
Йоу! Я запустил IncludeManager в файле с ошибками, и он создал график, который заставил меня смеяться вслух. По моим расчетам мне понадобится 400-
дюймовый

2
Обновление - компания ProFactor (www.profactor.co.uk), являющаяся материнской компанией IncludeManager, прекратила свою деятельность, но предоставляет последние версии бесплатно с вышеуказанного веб-сайта. Недостатком является то, что он работает только на полных версиях Visual Studio от VS2005 до VS2013.
Дана

5

Не так хорошо, как иерархическая функция включения gcc, которая показывает прямую иерархию включения в случае ошибки. Опция «show include» в VS показывает все, что является избыточным при отладке проблем с иерархическими включаемыми файлами.


Я жду этого с 5 лет, которые я использовал с mingw.
фантастика

2
Возможно, добавьте некоторые детали того, как его использовать, где находится документация и т. Д.? Этот ответ не добавляет много в настоящее время.
Сэм Брайтман

4

Вот хороший сторонний инструмент FOSS. Вы можете экспортировать результаты в XML, который будет включать данные о количестве вхождений и номерах строк.


4

Теперь есть плагин для Visual Studio, который называется IncludeToolbox . Он может перечислить ваши зависимые включения и делать больше вещей, таких как случайное удаление и компиляция, чтобы увидеть, требуется ли это включение.



2

cl / P должен показывать вам номера строк, чтобы вы могли определить контекст, из которого включается заголовочный файл.

Если вы выделите строки с ...

grep "^ # line" file.i

... тогда у вас должно быть достаточно четкое указание того, какие файлы были обнаружены в порядке препроцессором.

Если это случайный случай, это должно быть довольно быстрое диагностирование.


2
Конечно, но это дает мне восемь тысяч строк неструктурированного вывода без иерархии.
RichieHindle

Я достаточно долго просматривал вывод cl / P и задавался вопросом, есть ли лучший инструмент для этой работы. Теперь я обнаружил, что есть, и это здорово. Вопрос носит общий характер, и ответы будут здесь, на SO, навсегда, чтобы другие могли его найти.
RichieHindle

0

Я использую Doxygen и GraphViz .

введите описание изображения здесь

Установите оба. Обязательно выберите GraphViz в качестве инструмента для создания диаграмм иерархии. Выберите «Использовать точечный инструмент из пакета GraphVix».

Также обязательно включите двоичный каталог из GraphViz в переменную среды PATH.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.