Использование библиотеки C++ в коде C
у меня есть библиотека C++, которая предоставляет различные классы для управления данными. У меня есть исходный код для библиотеки.
Я хочу расширить API C++ для поддержки вызовов функций C, чтобы библиотека могла использоваться с кодом C и кодом C++ одновременно.
Я использую GNU tool chain (gcc, glibc и т. д.), Поэтому поддержка языка и архитектуры не является проблемой.
есть ли какие-либо причины, почему это технически не возможно?
есть попался тут что мне нужно остерегаться?
имеются ли ресурсы, пример кода и/или документация, касающиеся этого?
некоторые другие вещи, которые я узнал:
- используйте следующее, чтобы обернуть ваши заголовки C++, которые должны использоваться кодом C.
#ifdef __cplusplus
extern "C" {
#endif
//
// Code goes here ...
//
#ifdef __cplusplus
} // extern "C"
#endif
- держите" реальные " интерфейсы C++ в отдельных заголовочных файлах, которые не являются в комплекте С. Думаю принцип интеллекту здесь. Используя
#ifndef __cplusplus #error
материал помогает здесь обнаружить любое сумасшествие. - осторожно идентификаторов C++ в качестве имен в C-коде
- перечисления, различающиеся по размеру между компиляторами C и C++. Вероятно, это не проблема, если вы используете GNU tool chain, но все же будьте осторожны.
-
для структур следуйте следующей форме, чтобы C не запутался.
typedef struct X { ... } X
затем используйте указатели для передавая объекты C++, они просто должны быть объявлены в C как struct X, где X-объект C++.
все это любезно предоставлено другом, который является мастером на C++.
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-ваш главный. У вас есть много статических переменных, лучше всего заменить статические переменные синглетами.