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

Проблема: у меня есть большой проект на 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

10 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Попробуйте redhat Source-Navigator для более графического решения.

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

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

grep "^ # line" file.i

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

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

Просто нажмитеAlt-Shift-Hв JetBrains Rider, и вы получаете интерактивную иерархию включений

Другие вопросы по тегам