У меня есть библиотека C++, которая предоставляет различные классы для управления данными. У меня есть исходный код библиотеки.
Я хочу расширить C++ API для поддержки вызовов функций C, чтобы библиотеку можно было использовать с кодом C и кодом C++ одновременно.
Я использую цепочку инструментов GNU (gcc, glibc и т. д.), поэтому поддержка языка и архитектуры не является проблемой.
Есть ли причины, по которым это технически невозможно?
Есть ли какие-то подводные камни, на которые мне нужно обратить внимание?
Имеются ли ресурсы, примеры кода и/или документация по этому поводу?
Некоторые другие вещи, которые я узнал:
- Используйте следующее, чтобы обернуть заголовки C++, которые должны использоваться кодом C.
#ifdef __cplusplus
extern "C" {
#endif
//
// Code goes here ...
//
#ifdef __cplusplus
} // extern "C"
#endif
- Храните «настоящие» интерфейсы C++ в отдельных файлах заголовков, которые не включены в C. Вспомните здесь принцип PIMPL. . Использование
#ifndef __cplusplus #error
материала помогает обнаружить любое сумасшествие. - Будьте осторожны с идентификаторами C++ в качестве имен в коде C
- Перечисления различаются по размеру в компиляторах C и C++. Вероятно, это не проблема, если вы используете цепочку инструментов GNU, но все же будьте осторожны.
For structs follow the following form so that C does not get confused.
typedef struct X { ... } X
Затем используйте указатели для передачи объектов C++, их просто нужно объявить в C как структуру X, где X — объект C++.
Все это любезно предоставлено другом, который является волшебником C++.