Использование библиотеки C ++ в коде C

У меня есть библиотека C ++, которая предоставляет различные classы для управления данными. У меня есть исходный код для библиотеки.

Я хочу расширить C ++ API для поддержки вызовов функций C, чтобы библиотека могла использоваться с кодом C и кодом C ++ одновременно.

Я использую GNU tool chain (gcc, glibc и т. Д.), Поэтому поддержка языка и архитектуры не является проблемой.

Есть ли причины, по которым это технически невозможно?

Есть ли какие-то проблемы, о которых мне нужно следить?

Существуют ли ресурсы, пример кода и / или документация по этому поводу?


Некоторые другие вещи, которые я обнаружил:

  1. Используйте следующее, чтобы обернуть заголовки C ++, которые должны использоваться C-кодом.

#ifdef __cplusplus extern "C" { #endif // // Code goes here ... // #ifdef __cplusplus } // extern "C" #endif 
  1. Храните «реальные» C ++-интерфейсы в отдельных файлах заголовков, которые не включены в C. Принцип PIMPL . Использование #ifndef __cplusplus #error помогает здесь обнаруживать любые сумасшествия.
  2. Остерегайтесь идентификаторов C ++ как имена в коде C
  3. Перечисления различаются по размеру между компиляторами C и C ++. Вероятно, это не проблема, если вы используете цепочку инструментов GNU, но все же будьте осторожны.
  4. Для структур следуют следующей форме, так что С не путается.

     typedef struct X { ... } X 
  5. Затем используйте указатели для передачи объектов C ++, их просто нужно объявить в C как struct X, где X – объект C ++.

Все это любезно предоставлено знакомым, который является мастером на C ++.

Да, это, безусловно, возможно. Вам нужно будет написать слой интерфейса на C ++, который объявляет функции с помощью extern "C" :

 extern "C" int foo(char *bar) { return realFoo(std::string(bar)); } 

Затем вы foo() из вашего модуля C, который передаст вызов функции realFoo() которая реализована на C ++.

Если вам нужно выставить полный class C ++ с элементами данных и методами, вам может потребоваться сделать больше работы, чем этот простой пример функции.

C ++ FAQ Lite: «Как смешивать код C и C ++» .

Некоторые ответы рассматриваются в ответах на эти вопросы:

  • [32.8] Как передать объект classа C ++ в / из функции C?
  • [32.9] Может ли моя функция C напрямую обращаться к данным в объекте classа C ++?

Основная информация: исключения не могут быть обнаружены в C. Если есть вероятность возникновения исключения в коде C ++, очень тщательно пишите свой C-код или ваши C ++-обертки. И наоборот, исключения, подобные механизмам (то есть longjump) в коде C (как показано на разных языках сценариев), не требуются для вызова деструкторов для объектов C ++ в стеке.

вы можете смешивать код C / C ++. Если ваша функция main () находится на C ++, вам просто нужно убедиться, что ваши c-функции объявлены

 extern "C" 

Если ваш основной C, то вы, вероятно, хорошо, за исключением статических переменных. Любые конструкторы со статическими переменными должны быть вызваны до начала main (). Это не произойдет, если C является вашим основным. У вас много статических переменных, лучше всего заменить статические переменные одиночными.

Interesting Posts
Давайте будем гением компьютера.