2010-09-04 3 views
23

Есть ли какие-либо инструменты, помогающие организовать #include s, которые находятся в верхней части файла .c или .h?Есть ли инструменты, которые помогают организовать #includes?

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

Это просто раздражает и подвержен ошибкам, чтобы выяснить все #includes вручную. Часто код компилируется, хотя не все #include s есть. Пример: файл A использует std::vector экстенсивно, но не включает vector; но в настоящее время он включает в себя некоторый непонятный другой заголовок, который включает в себя vector (возможно, через некоторые рекурсивные включения).

+0

Я нашел дискуссию по этой проблеме на сайте Eclipse CDT: http://wiki.eclipse.org/CDT/C_editor_enhancements/Include_management – Frank

ответ

1
+0

Хорошая идея, но, вероятно, не совсем то, что мне нужно. Мне нужен инструмент, который подскажет мне, что я должен включить, даже если я еще не добавил ни одного из них (makedepend и друзья будут давать ошибку в этом случае). Eclipse делает это для Java (возможно, для C++ тоже?). Кроме того, makedepend сообщает мне зависимости для каждой единицы компиляции ('.o' файл), но не то, что должен включать определенный заголовочный файл. – Frank

+3

Я думаю, что проблема, поставленная вами, необратима. Например, я могу запустить программу, которая сообщает мне, что 'EOF' не определено в' foo.c'. Я также могу механически определить, что EOF определен в 'libio.h',' stdio.h' и (например, '' foo.h'. Что я могу включить? – msw

+4

Вы представляете действительную точку. Тем не менее, инструмент все еще может создавать предложения, основанные на том, какие заголовки присутствуют в пути включения, и, возможно, даже стандартные (или популярные). –

2

VisualAssistX может помочь вам прыгать к определению типа. Например. если вы используете класс MyClass в своем источнике, вы можете щелкнуть его, выбрать определение goto, а VisualAssistX откроет файл include, содержащий определение этого класса (возможно, Visual Studio также может это сделать, но на данный момент я так привык к VisualAssistX, что я вношу каждую замечательную функцию в VisualAssistX :-)). Вы можете использовать это, чтобы найти файл include, необходимый для вашего исходного кода.

PC-Lint может делать как раз наоборот. Если у вас есть дополнительный файл в вашем источнике, который не используется, PC-Lint может предупредить вас об этом, так что вы знаете, что файл include можно удалить из источника (что положительно повлияет на время вашей компиляции) ,

0

Я использую графы doxygen/dot-graphviz, чтобы увидеть, как связаны файлы. Очень удобно, но не автоматически, вы должны визуально проверить графики, а затем отредактировать код, чтобы удалить ненужные строки «#include». Конечно, не очень подходит для очень больших проектов (скажем, 100 файлов), где графики становятся непригодными.

1

В последнее время я столкнулся с этой проблемой. В нашем проекте мы используем C++ и имеют один Xh и один x.cpp файл для каждого класса X.

Моя стратегия заключается в следующем:

(1) Если Ах, где объявлен класс А, относится к класс B, затем Я должен включить заголовок Bh Если объявление класса А содержит только тип * B, тогда мне нужно только объявление forward класс B; в A.h. Мне может потребоваться включить B.h в A.cpp

(2) Используя приведенную выше процедуру, я перемещаю как можно больше от A.h до A.cpp. Затем я пытаюсь удалить один из них за один раз и посмотреть, все еще компилируется файл .cpp. Это должно позволить свести к минимуму набор включенных файлов в файл .cpp, но я не уверен на 100%, если результат минимален. Я также думаю, что можно написать инструмент для этого автоматически. Я начал писать один для Visual Studio. Я был бы рад узнать, что есть такие инструменты.

Примечание: возможно, добавление надлежащей конструкции модуля с четко определенными отношениями импорта/экспорта может быть желательным дополнением для C++ 0x. Это значительно облегчило бы задачу реорганизации импорта и ускорила бы компиляцию.

1

Поскольку этот вопрос был задан новый инструмент был создан: include-what-you-use, она основана на лязгом, обеспечивает отображения фальсифицировать существование определенных символов (unique_ptr в memory, но на самом деле это определено в bits/unique_ptr.h в некоторых стандартных заголовков и позволяет вы предоставляете свои собственные отображения.

это обеспечивает хороший диагностику и автоматическую перезапись.

1

Now each of the smaller files needs a subset of the #includes that were at the top of the long file.

Я делаю это с помощью VisualAssistX. Во-первых, скомпилировать файл, чтобы увидеть, что это неправильно петь. Затем вы можете использовать функцию добавления добавления VisualAssistX. Поэтому я просто иду и щелкаю правой кнопкой мыши по функциям или классам, которые, как мне известно, нуждаются в включении, и нажмите Add Include. Перекомпилировать пару раз, чтобы отфильтровать новые отсутствующие, и это делается. Надеюсь, я написал это по понятным причинам :)

Не идеально, но быстрее, чем делать это вручную.

Смежные вопросы