Есть ли инструмент (или флаг Gcc / Clang), который создает файл C++ с одним заголовком из файла заголовка, который #include содержит несколько других заголовков (STL и пользовательские)? Заголовки STL #include должны быть оставлены нетронутыми.
Например, учитывая эти файлы:
// a.h
#pragma once
#include <my_lib/aa.h>
void baz() {}
// aa.h
#pragma once
void foo(int) {}
// b.h
#pragma once
void bar(float) {}
// master.h
#pragma once
#include <string>
#include <my_lib/a.h>
#include <memory>
#include <my_lib/b.h>
#include <vector>
Запуск инструмента на master.h даст следующий результат (пробелы могут отличаться):
#pragma once
#include <string>
void foo(int) {}
void baz() {}
#include <memory>
void bar(float) {}
#include <vector>
Если внутри #include есть какие-либо #ifdef, их также следует сбросить.
gcc -E master.h или clang -E master.h@VTT Его проще использовать в проектах, потому что вам не нужно ничего добавлять к путям поиска заголовков, вы просто #include этот единственный заголовок. @Sergey С clang, который, похоже, не работает ... master.h затем включает в себя множество строк, таких как # 1 "<built-in>" 1, а также, кажется, встраивает заголовки STL.
Тогда это очень плохая идея, вам все равно нужно будет добавить все в пути поиска заголовков для создания этого объединенного заголовка, вам нужно будет вручную отслеживать зависимости и обновлять этот комбинированный заголовок, когда какая-либо из зависимостей изменится, будет сложно выяснить, какие заголовки на самом деле требуются вашему проекту, поэтому удаление чего-либо из такого объединенного заголовка может стать проблематичным. @Sergey -E запускает проход препроцессора, он ничего не объединяет.
@VTT Многие библиотеки предоставляют версию с одним заголовком, и многие люди (включая меня) используют их и считают их хорошей идеей. Я ищу решения, а не мнения.
Библиотека с одним заголовком (не путать с библиотекой только с заголовком) и «объединенный заголовок», которые вы описали, кажутся несвязанными понятиями. Кроме того, формат с одним заголовком целесообразен только в том случае, если библиотека относительно небольшая.
Я описал библиотеку с одним заголовком, используя именно эти слова в своем вопросе. В названии есть слово «объединить», потому что я думал, что оно описывает процесс (хотя английский не мой родной язык). В любом случае я бы не сказал, что понятия «не связаны». Так ты знаешь, как это сделать? Потому что я не думаю, что Stackoverflow - подходящая платформа, чтобы просто обсуждать плюсы и минусы того или иного подхода.





У меня создал сценарий для этого.
Как можно использовать такой заголовок?