Как автоматизировать поиск неиспользуемых директив #include?
Обычно при написании нового кода вы обнаруживаете, что вам не хватает #include, потому что файл не компилируется. Достаточно просто, вы добавляете требуемый #include. Но позже вы каким-то образом реорганизуете код, и теперь несколько директив #include больше не нужны. Как узнать, какие из них больше не нужны?
Конечно, я могу вручную удалить некоторые или все строки #include и добавить их обратно до тех пор, пока файл не будет компилироваться снова, но это не реально в большом проекте с тысячами файлов. Существуют ли какие-либо инструменты, которые помогут автоматизировать задачу?
Ответы
Ответ 1
Вы можете использовать PC-Lint/FlexeLint для этого.
Необычно нет свободной версии операционной системы.
Вы можете удалить #includes путем передачи по ссылке вместо передачи по значению и форварду. Это связано с тем, что компилятору не нужно знать размер объекта во время компиляции. Это потребует большого объема ручной работы от вашего имени. Хорошо, что это сократит время компиляции.
Ответ 2
Вы можете просто написать инструмент командной строки "грубая сила", который комментирует #includes один за другим и проверяет, работает ли компилятор. Дайте мне знать, когда вы заработаете.; 0)
Ответ 3
В этой статье объясняется метод удаления #include с помощью разбора Doxygen. Это просто perl script, поэтому он довольно прост в использовании.
Ответ 4
Существует плагин Eclipse, называемый вставки, который помогает управлять зависимостями включения в проектах C/С++
http://includator.com/
Ответ 5
Вот макрос VC6 "грубой силы", который работает с одним файлом .cpp или .h, открытым в редакторе путем комментирования include include и running compile:
Sub RemoveNotUsedIncludes()
'Check if already processed; Exit if so
ActiveDocument.Selection.FindText "//INCLUDE NOT USED", dsMatchFromStart
IF ActiveDocument.Selection <> "" THEN
ActiveDocument.Selection.SetBookmark
MsgBox "Already checked"
ActiveDocument.Selection.ClearBookmark
EXIT SUB
END IF
'Find first #include; Exit if not found
ActiveDocument.Selection.FindText "#include", dsMatchFromStart
IF ActiveDocument.Selection = "" THEN
MsgBox "No #include found"
EXIT SUB
END IF
Dim FirstIncludeLine
FirstIncludeLine = ActiveDocument.Selection.CurrentLine
FOR i=1 TO 200
'Test build
ActiveDocument.Selection.SetBookmark
ActiveDocument.Selection = "//CHECKING... #include"
Build
ActiveDocument.Undo
ActiveDocument.Selection.ClearBookmark
IF Errors = 0 THEN
'If build failed add comment
ActiveDocument.Selection.EndOfLine
ActiveDocument.Selection = " //INCLUDE NOT USED"
END IF
'Find next include
ActiveDocument.Selection.EndOfLine
ActiveDocument.Selection.FindText "#include"
'If all includes tested exit
IF ActiveDocument.Selection.CurrentLine = FirstIncludeLine THEN EXIT FOR
NEXT
Конец Sub
В любом случае это может быть улучшено для работы над целым проектом.