Подтвердить что ты не робот

"Глубокий" анализ зависимостей заголовков

Я работаю над проектом среднего размера C/С++, к которому я уже применил Doxygen + Graphviz. Его графы заголовков полезны, но они показывают только отношения, основанные на #include. Мне интересно найти инструмент (предпочтительно на основе Linux), который анализирует зависимости файлов, основанные не только на #include, но и на фактическом использовании символов. Например, такой инструмент не только покажет, что a.cpp включает b.h, но что a.cpp использует SomeClass, объявленный в c.h включенном b.h. Он также сможет предложить заголовок, который можно обрезать.

4b9b3361

Ответ 1

Я использовал Включить то, что вы используете, с хорошими результатами. Он использует Clang для синтаксического анализа кода на С++ и предлагает пересылать объявления для добавления и файлы заголовков для удаления.

Один из недостатков заключается в том, что он делает предположения относительно компоновки вашего кода - в основном, стандартов кодирования Google. Поэтому он будет смотреть только на SomeFile.h, если у вас есть файл с именем SomeClass.cpp. Также предлагается использовать полные пути из корня вашего проекта (так #include "src/SomeClass.h" вместо #include "SomeClass.h"). В конце концов, я все равно изменил свой код на это соглашение, так как он избегает двусмысленности, но ему нужно хэдз-ап, если вы его попробуете.

Обычно вы можете просто установить CC=include-what-you-use и перестроить для получения результатов - он использует все механизмы clang для анализа -I include аргументов. Там есть программа python, которая использует результат для автоматического обновления ваших строк #include.

EDIT:

Еще один инструмент, который не такой сложный, но его проще настроить и может предложить #include удалить deheader. Он работает, копируя ваш файл С++ во временное место, удаляя #include и перекомпилируя. Если перекомпиляция работает, тогда безопасно удалить этот файл заголовка. То, что он не будет делать, это предлагать передовые объявления или что-то фантастическое, но оно может сократить ненужные строки включения в ваши файлы реализации.