!! ОТКАЗ !! Я работаю над коммерческим инструментом статического анализа (не PC Lint). !! ОТКАЗ !!
Существует несколько проблем с простым подходом без разбора:
1) Наборы перегрузки:
Возможно, перегруженная функция имеет объявления из разных файлов. Возможно, удаление одного заголовочного файла приведет к выбору другой перегрузки, а не к ошибке компиляции! Результатом будет тихое изменение семантики, которое впоследствии может быть очень трудно отследить.
2) Шаблон специализации:
Как и в примере с перегрузкой, если у вас есть частичная или явная специализация для шаблона, вы хотите, чтобы все они были видны при использовании шаблона. Возможно, специализации для основного шаблона находятся в разных заголовочных файлах. Удаление заголовка со специализацией не приведет к ошибке компиляции, но может привести к неопределенному поведению, если бы эта специализация была выбрана. (См .: Видимость шаблонной специализации функции C ++ )
Как указывает msalters, выполнение полного анализа кода также позволяет анализировать использование классов. Проверяя, как класс используется через определенный путь к файлам, возможно, что определение класса (и, следовательно, всех его зависимостей) может быть полностью удалено или, по крайней мере, перемещено на уровень ближе к основному источнику в include дерево.