Я пытался использовать Flexelint (Unix-версия PC-Lint) и получил несколько смешанные результаты. Это вероятно потому, что я работаю над очень большой и запутанной кодовой базой. Я рекомендую внимательно изучить каждый файл, который указан как неиспользованный.
Основное беспокойство - ложные срабатывания. Несколько включений одного и того же заголовка сообщаются как ненужный заголовок. Это плохо, поскольку Flexelint не сообщает вам, в какую строку включен заголовок или где он был включен ранее.
Один из способов, которым автоматизированные инструменты могут ошибиться:
В A.hpp:
class A {
// ...
};
В B.hpp:
#include "A.hpp
class B {
public:
A foo;
};
В C.cpp:
#include "C.hpp"
#include "B.hpp" // <-- Unneeded, but lint reports it as needed
#include "A.hpp" // <-- Needed, but lint reports it as unneeded
Если вы будете слепо следить за сообщениями от Flexelint, вы испортите свои зависимости #include. Есть больше патологических случаев, но в основном вам нужно будет самостоятельно проверить заголовки для достижения наилучших результатов.
Я настоятельно рекомендую эту статью о физической структуре и C ++ из блога Games from inside. Они рекомендуют комплексный подход к устранению путаницы #include:
Руководящие указания
Вот несколько рекомендаций из книги Лакоса, которые сводят к минимуму количество физических зависимостей между файлами. Я использую их годами и всегда был очень доволен результатами.
- Каждый файл cpp сначала включает свой собственный заголовочный файл. [Надрез]
- Заголовочный файл должен включать все заголовочные файлы, необходимые для его анализа. [Надрез]
- Заголовочный файл должен иметь минимальное количество заголовочных файлов, необходимых для его анализа. [Надрез]