Подтвердить что ты не робот

Как автоматизировать поиск неиспользуемых директив #include?

Обычно при написании нового кода вы обнаруживаете, что вам не хватает #include, потому что файл не компилируется. Достаточно просто, вы добавляете требуемый #include. Но позже вы каким-то образом реорганизуете код, и теперь несколько директив #include больше не нужны. Как узнать, какие из них больше не нужны?

Конечно, я могу вручную удалить некоторые или все строки #include и добавить их обратно до тех пор, пока файл не будет компилироваться снова, но это не реально в большом проекте с тысячами файлов. Существуют ли какие-либо инструменты, которые помогут автоматизировать задачу?

4b9b3361

Ответ 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

В любом случае это может быть улучшено для работы над целым проектом.