библиотека c ++ с интерфейсом c - PullRequest
11 голосов
/ 12 февраля 2011

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

Спасибо в совете для ответа.

1 Ответ

16 голосов
/ 12 февраля 2011

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

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

<ч />

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...