Как автоматизировать поиск неиспользуемых директив #include? - PullRequest
27 голосов
/ 09 сентября 2008

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

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

Ответы [ 5 ]

4 голосов
/ 09 сентября 2008

Для этого можно использовать PC-Lint / FlexeLint .

Необычно, что нет бесплатной версии ОС для инструмента.

Вы можете удалить #include путем передачи по ссылке вместо передачи по значению и объявления вперед. Это потому, что компилятору не нужно знать размер объекта во время компиляции. Однако это потребует большого количества ручной работы от вашего имени. Хорошо, что это сократит время компиляции.

3 голосов
/ 09 сентября 2008

Вы можете просто написать инструмент командной строки 'brute force', который закомментирует #include один за другим и проверяет, все ли работает компиляция. Дайте мне знать, когда у вас это получится. ; 0)

2 голосов
/ 06 апреля 2011

Существует плагин Eclipse, называемый includedator, который помогает управлять зависимостями включения в проектах C / C ++

http://includator.com/

2 голосов
/ 09 сентября 2008

В этой статье объясняется техника удаления #include с помощью анализа Doxygen. Это всего лишь скрипт на Perl, поэтому его довольно просто использовать.

0 голосов
/ 29 декабря 2011

Вот макрос VC6 «грубой силы», который работает с одним .cpp или .h файлом, открытым в редакторе с помощью комментариев, включением и включением компиляции. :

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

End Sub

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...