Я столкнулся с проблемой, что я не знаю, как решить.Удалить прекомпилятора директиву из .h файла заголовка
Пусть следующая ЬурейаЯ структура в файл заголовок test.h:
typedef struct example_struct {
#ifdef CONFIG_A
int A;
#endif;
int B;
} example_struct_t;
Я компиляция коды с помощью этого файл заголовка проходящего CONFIG_A в GCC с опцией -D. Таким образом, я могу включить член в структуру или удалить, если не нужен для данного варианта использования.
Теперь предположим, что я создаю общую библиотеку (.so), и я хотел бы ее распространять. Итак, у меня есть библиотека .so и заголовки с предкомпиляторными директивами. Проблема в том, что я бы не хотел включать в программу программу -DCONFIG_A, используя библиотеку, я имею в виду, мне нужно было бы использовать параметры, используемые во время компиляции библиотеки, не только в исходных файлах (.c), но и в заголовок. То есть, если компилировать библиотеку с параметром -DCONFIG_A, я полагаю, что программа, использующая библиотеку, не должна включать эту опцию во время компиляции.
Являются ли предварительно скомпилированные заголовки решением этой проблемы или есть ли другая альтернатива (исключая заголовок config.h в каждом файле, определяющем директивы прекомпилятора)?
Спасибо большое за руководством.
Звучит как проблема XY: Вопрос, как исправить неправильное решение проблемы. И выберите язык: C или C++? – Olaf
Для C++ существует [Одно правило определения (aka ODR)] (https://en.wikipedia.org/wiki/One_Definition_Rule). Если 'CONFIG_A' определяется при компиляции некоторых [единиц перевода] (https://en.wikipedia.org/wiki/Translation_unit_ (программирование)), но не для других, вы имеете * неопределенное поведение *. –
При установке библиотеки вы также можете установить файл 'mylibrary.pc' с соответствующими параметрами препроцессора. Затем попросите своих пользователей использовать 'pkg-config --cflags mylibrary'. – rodrigo