Отображение иерархии #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
RichieHindle
источник
2
Для людей, которые ищут решение GCC / Clang, используйте gcc -H -fsyntax-only ...для вывода иерархии. Кредиты для stackoverflow.com/a/18593344/427545
Лекенштейн

Ответы:

234

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

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

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

xtofl
источник
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.

Сантьяго Вильяфуэрте
источник