«Глубокий» анализ зависимостей заголовка - PullRequest
22 голосов
/ 04 мая 2011

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

1 Ответ

20 голосов
/ 04 мая 2011

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

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

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

EDIT:

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

...