Обнаружение лишнего #includes в C/C++?

Поскольку мы не знаем, что именно делается с элементами, отличными от NaN, вот иллюстрация того, как они могут быть инвертированы:

dataframe[dataframe.notna()] = 1 / dataframe

Как вы можете видеть, в этом нет циклов. Если вам нужен более конкретный ответ, пожалуйста, задайте более конкретный вопрос.

271
задан jww 10 December 2018 в 05:13
поделиться

12 ответов

Это не автоматически, но , doxygen произведет схемы зависимости для #included файлы. Необходимо будет пройти их визуально, но они могут быть очень полезны для получения изображения того, что использует что.

42
ответ дан albert 23 November 2019 в 02:16
поделиться

Gimpel Software Линт пк может сообщить относительно того, когда включать файл был включен несколько раз в единице компиляции <забастовка>, но это не может найти, включают файлы, которые не нужны в способе, которым Вы ищете.

Редактирование: Это может. См. ответ itsmatt

0
ответ дан Community 23 November 2019 в 02:16
поделиться

Эта статья объясняет метод удаления #include при помощи парсинга Doxygen. Это - просто сценарий жемчуга, таким образом, это довольно просто в использовании.

2
ответ дан Steve Gury 23 November 2019 в 02:16
поделиться

Я попытался использовать Flexelint (версия Unix Линта ПК) и несколько смешал результаты. Это вероятно, потому что я работаю над очень большой и затруднительной кодовой базой. Я рекомендую тщательно исследовать каждый файл, о котором сообщают как неиспользованном.

основное беспокойство является ложными положительными сторонами. Несколько включают того же заголовка, сообщаются как ненужный заголовок. Это плохо, так как 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++ из блога Игры из. Они рекомендуют комплексный подход к чистке путаницы #include:

Инструкции

Here’s дистиллированный набор инструкций из книги Lakos’, которые минимизируют количество физических зависимостей между файлами. I’ve, с помощью них в течение многих лет и I’ve, всегда действительно довольный результатами.

  1. Каждый cpp файл включает свой собственный заголовочный файл сначала. [надрез]
  2. заголовочный файл А должен включать все заголовочные файлы, необходимые для парсинга его. [надрез]
  3. заголовочный файл А должен иметь количество абсолютного минимума заголовочных файлов, необходимых для парсинга его. [надрез]
4
ответ дан Ben Martin 23 November 2019 в 02:16
поделиться

Я никогда не находил законченный инструмент, который выполняет то, что Вы спрашиваете. Самая близкая вещь, которую я использовал, IncludeManager, который изображает Ваше дерево включения заголовка в виде графика, таким образом, можно визуально определить вещи как заголовки, включенные только в один файл и круговые включения заголовка.

5
ответ дан Dan Olson 23 November 2019 в 02:16
поделиться

Извините к (пере-) сообщение здесь, люди часто не разворачивают комментарии.

Проверка мой комментарий к crashmstr, FlexeLint / Линт ПК сделает это для Вас. Информационное сообщение 766. Разделите 11.8.1 из моего руководства (версия 8.0), обсуждает это.

кроме того, и это важно, продолжайте выполнять итерации, пока сообщение не уходит . Другими словами, после удаления неиспользованных заголовков, повторно выполняет линт, больше заголовочных файлов, возможно, стало "ненужным", как только Вы удаляете некоторые ненужные заголовки. (Который мог бы звучать глупым, медленно читать его & проанализируйте его, это имеет смысл.)

5
ответ дан Dan 23 November 2019 в 02:16
поделиться

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

Позволяют ему работать в течение ночи, и на следующий день у Вас будет 100%-й корректный список, включают файлы, которые можно удалить.

Иногда "в лоб" просто работает:-)

<час>

редактирование: и иногда это не делает:-). Вот немного информации из комментариев:

  1. Иногда можно удалить два заголовочных файла отдельно, но не обоих вместе. Решение состоит в том, чтобы удалить заголовочные файлы во время выполнения и не возвратить их. Это найдет список файлов, которые можно безопасно удалить, хотя там мог бы решение с большим количеством файлов для удаления, который не найдет этот алгоритм. (это - жадный поиск по пространству, включают файлы для удаления. Это только найдет локальный максимум)
  2. могут быть тонкие изменения в поведении, если у Вас есть некоторые макросы, переопределенные по-другому в зависимости от некоторого #ifdefs. Я думаю, что это очень редкие случаи, и Модульные тесты, которые являются частью сборки, должны поймать эти изменения.
6
ответ дан Gilad Naor 23 November 2019 в 02:16
поделиться

браузер рефакторинга CScout может обнаружить лишний, включают директивы в C (к сожалению, не C++) код. Можно найти описание того, как оно работает в этот статья в журнале.

7
ответ дан Diomidis Spinellis 23 November 2019 в 02:16
поделиться

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

я посмотрел , этот блог и автор говорили немного о конфигурировании PCLint для нахождения неиспользованным, включает. Мог бы быть достойный внимания.

15
ответ дан itsmatt 23 November 2019 в 02:16
поделиться

Проблема с обнаружением лишнего включает, то, что это не может быть просто средство проверки зависимости от типа. Лишнее включает, файл, который обеспечивает, ничто из значения к компиляции и не изменяет другой объект, который зависят другие файлы. Существует много способов, которыми заголовочный файл может изменить компиляцию, сказать путем определения константы, переопределения и/или удаления используемого макроса, добавления пространства имен, которое изменяет поиск имени некоторый путь по линии. Для обнаружения объектов как пространство имен, в котором Вы нуждаетесь намного больше, чем препроцессор, Вам на самом деле почти нужен полный компилятор.

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

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

24
ответ дан Jonathan Leffler 23 November 2019 в 02:16
поделиться

cppclean Google (связывается с: загрузка , документация ), может найти несколько категорий проблем C++, и она может теперь найти лишний #includes.

существует также Основанный на лязге инструмент, include-what-you-use, который может сделать это. include-what-you-use может даже предложить предописания (таким образом, Вы не имеете к #include так), и дополнительно очистите свой #includes для Вас.

Текущие версии Eclipse CDT также встроили эту функциональность: движение в соответствии с меню Source и нажатие на Organize Includes расположат в алфавитном порядке Ваш #include, добавить любые заголовки, что Eclipse думает, что Вы используете без непосредственно включая их, и комментирует любые заголовки, что это не думает, что Вам нужно. Эта функция не на 100% надежна, как бы то ни было.

162
ответ дан Nick 23 November 2019 в 02:16
поделиться

Возможно, немного поздно, но однажды я нашел Perl-скрипт WebKit, который делал именно то, что вы хотели. Думаю, потребуется некоторая адаптация (я плохо разбираюсь в perl), но она должна помочь:

http://trac.webkit.org/browser/branches/old/safari-3-2 -branch / WebKitTools / Scripts / find-extra-includes

(это старая ветка, потому что в магистрали больше нет файла)

1
ответ дан 23 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: