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