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


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

Я хочу расширить API C++ для поддержки вызовов функций 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++ в отдельных заголовочных файлах, которые не являются в комплекте С. Думаю принцип интеллекту здесь. Используя #ifndef __cplusplus #error материал помогает здесь обнаружить любое сумасшествие.
  2. осторожно идентификаторов C++ в качестве имен в C-коде
  3. перечисления, различающиеся по размеру между компиляторами C и C++. Вероятно, это не проблема, если вы используете GNU tool chain, но все же будьте осторожны.
  4. для структур следуйте следующей форме, чтобы C не запутался.

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

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

4 90

4 ответа:

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

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

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

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

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

некоторые проблемы описаны в ответах на эти вопросы:

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

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

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

extern "C"

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