Библиотека С++ с интерфейсом c

Мне нужно написать библиотеку в С++, которую можно использовать клиентом для выполнения некоторых операций на удаленном сервере. Единственное, что в конкретном я еще не сделал, это: библиотеке С++ нужен C-интерфейс. Позвольте мне объяснить лучше: От клиента, использующего эту библиотеку, мне нужно сделать что-то вроде: int (void * addr); если ошибка int < 0 и так.. Но библиотека это класс в С++. Поэтому мой ответ. Нужна ли мне глобальная переменная, содержащая экземпляр класса в библиотеке? Есть ли лучший вариант для разработки этого C-интерфейса класса С++?

спасибо в рекомендации для ответа.

Ответ 1

Вы можете использовать PIMPL idiom в обертке C. Вы предоставляете метод YourClass_Create, который внутренне вызывает конструктор (используя new) и возвращает указатель на экземпляр класса; для клиентского кода это будет просто непрозрачный дескриптор (он может быть typedef для void *), который должен быть передан каждой функции вашего интерфейса C, чтобы указать, на каком экземпляре он должен работать (точно так же, как FILE * в stdio).

Все эти функции должны будут состоять в том, чтобы вызвать соответствующий метод в дескрипторе (преобразован обратно в указатель на ваш класс) и перевести исключения в коды ошибок.


Как отметил в своем комментарии @jdv-Jan de Vaan, не забывайте о необходимости #ifdef ed extern "C" {} вокруг вашего кода оболочки C, иначе вы можете получить ошибки компоновщика.