1

Я столкнулся с проблемой, что я не знаю, как решить.Удалить прекомпилятора директиву из .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 в каждом файле, определяющем директивы прекомпилятора)?

Спасибо большое за руководством.

+3

Звучит как проблема XY: Вопрос, как исправить неправильное решение проблемы. И выберите язык: C или C++? – Olaf

+5

Для C++ существует [Одно правило определения (aka ODR)] (https://en.wikipedia.org/wiki/One_Definition_Rule). Если 'CONFIG_A' определяется при компиляции некоторых [единиц перевода] (https://en.wikipedia.org/wiki/Translation_unit_ (программирование)), но не для других, вы имеете * неопределенное поведение *. –

+0

При установке библиотеки вы также можете установить файл 'mylibrary.pc' с соответствующими параметрами препроцессора. Затем попросите своих пользователей использовать 'pkg-config --cflags mylibrary'. – rodrigo

ответ

0

Вы можете «сгенерировать» код для определения структуры и отправить сгенерированное определение вместе с соответствующей библиотекой. Одна идея состоит в том, чтобы сохранить свои структуры в заголовке, без #include с, в этом случае вы можете запустить C препроцессор на них, чтобы получить файл, без #ifdef с (которые затем можно использовать для создания и корабля).

Другой способ - сделать что-то особенное в вашей системе сборки. Например, CMake имеет #cmakedefine, который вы можете использовать в исходном файле C или C++, а затем сгенерировать код.

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