Как создать файл включения верхнего уровня - PullRequest
1 голос
/ 04 апреля 2011

Как создать файл включения верхнего уровня, который включает все остальные заголовочные файлы из всех подкаталогов?

Я работаю над большим проектом со многими подкаталогами и множеством заголовочных файлов в этих подкаталогах. Подкаталоги содержат больше подкаталогов, и у этих подкаталогов есть больше файлов заголовка. Это большое дерево, похожее на многоуровневую структуру. Я хочу предоставить заголовочный файл верхнего уровня пользователям, которые не хотят включать заголовки вручную. Файл заголовка верхнего уровня должен включать все остальные заголовки с относительным путем. Я тону, чтобы автоматизировать процесс с помощью sed или awk, но не знаю, с чего начать.

Любые советы приветствуются.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 04 апреля 2011

Другие ответы расскажут вам, как это сделать, и будут хорошо работать, но есть некоторые потенциальные проблемы с этим подходом:

  • Время компиляции может быть значительно увеличено, так как нужно читать и обрабатывать больше заголовков.

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

  • усложняет рассмотрение проекта как совокупности мелких проблем и подсистем.

  • возможность столкновения и затенения имен функций / переменных (особенно в C без пространств имен для ограничения области действия)

Лучшее решение - правильно организовать свой проект. Разбейте его на подсистемы и библиотеки, заголовки которых предоставляют полезный ограниченный интерфейс для остальной системы, сохраняя при этом подробности реализации внутри библиотеки / подсистемы / модуля.

4 голосов
/ 04 апреля 2011

find . -name '*.h' | sed -e 's/\.\///' -e 's/^/#include "/' -e 's/$/"/' >> master.h

  • Найти все .h файлы
  • убрать ведущий "./"
  • добавить #include " в начале строки
  • добавить " в конце строки
  • перенаправить на master.h

Но я не уверен, что это такая хорошая идея.

Я бы предпочел включить только необходимые заголовки и сохранить как можно меньше нужных заголовков.

4 голосов
/ 04 апреля 2011

Вы на правильном пути. Лично я бы использовал find и просто направлял вывод в файл. Что-то вроде:

 find . -name "*.h" -print > myBigHeader.h

Кроме того, вы захотите разобраться с генерацией зависимостей в вашем make-файле, чтобы при изменении одного из этих заголовков make make могла перекомпилировать объекты, которые от него зависят.

2 голосов
/ 04 апреля 2011
echo "#ifndef INCLUDEALLH" > includeall.h
echo "#define INCLUDEALLH" >> includeall.h
find . -name \*.h | sed 's,^[.]/,,' | while read line; do echo "#include \"$line\""; done >> includeall.h
echo "#endif" >> includeall.h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...