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

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

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

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

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

Есть ли gotcha, на что я должен следить?

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


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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

extern "C"

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