Есть ли какие-либо подсказки, которые можно дать мне о передающих указателях на структуры, удваивается, функционирует... от программы C до библиотеки C++ и назад?
Предполагая, что вы кодируете их в двух разных библиотеках Статические или динамические (DLL в Windows Sharied Biblicies на Linux и другие варианты * NIX) самые большие проблемы, которые у меня есть следующие:
они скомпилированы с тем же компилятором. Хотя это не нужно, если все экспорт C ++ экспортируются с конвенцией именования в стиле C ++, необходимо для вызовов C ++ C ++ к экземплянам классов между двумя модулями C ++. Это необходимо из-за того, насколько различные компиляторы следите в C ++ экспортируют по-разному.
Не бросайте класс C ++ в качестве структуры C. Они не одинаковы под крышками, даже если планировка полей одинаковы. Классы C ++ имеют «V-таблицу», если у них есть какие-либо виртуальные участники; Эта V-таблица позволяет правильному вызову унаследованных или базовых классов методов.
Это верно от C до C или C ++ к C ++, а также C для C ++. Убедитесь, что оба используют одно и то же байтовое выравнивание для выходной библиотеки. Вы можете определить только это, читая документацию о средах компилятора или развития.
Не смешивайте malloc / бесплатно с новым / удалением. Более конкретно не выделяйте память с новой и свободной памятью с «Free» и наоборот. Многие компиляторы и операционные системы обрабатывают управление памятью по-разному между двумя.
Передача указателей функции: пока они подвергаются воздействию / от C ++ как «Extern» C "'' Это должно быть в порядке. (Вам также нужно будет ссылаться на документацию о компиляторах о том, как определить, когда заголовок составляется как C или C ++, чтобы поддерживать это в одном файле, или вам понадобится два отдельных копиях такого же декларации функций в каждом проекте - я Рекомендовать первое)
прохождение удваивает: это встроенный тип в C и C ++, и следует обрабатывать одинаково.
Если вы должны поделиться экземпляром объекта C ++ с функцией C, и действуйте на него в рамках C-кода C, выставляйте набор функций, экспортируемых CLEPER CLEPER, который вызывает соответствующие методы на объекте C ++. Чистый C-код не может правильно вызовать методы на объектах C ++.
Pseudocode-ish Example:
// C++ class
class foo {
public:
void DoIt();
};
// export helper declarations
extern "C" void call_doit(foo* pFoo);
extern "C" foo* allocate_foo();
extern "C" deallocate_foo(foo* pFoo);
// implementation
void call_doit(foo* pFoo)
{
pFoo->DoIt();
}
foo* allocate_foo()
{
return new foo();
}
deallocate_foo(foo* pFoo)
{
delete pFoo;
}
// c consumer
void main()
{
foo* pFoo= allocate_foo();
call_doit(pFoo);
dealocate_foo(pFoo);
}
C и C ++ Указатели одинаковы - указатель в основном указывает на блок памяти, и это не изменяется от C / C ++.
Вы хотите быть осторожны о том, чтобы не пересекать типы кучи - например, не выделяйте в одной библиотеке и депределить в библиотеке, которая может иметь другую кучу или использовать другую версию времени выполнения (или наоборот).
Вы имели в виду спросить о вопросах по сравнению с пропускной стоимостью или справочниками? Это может помочь обеспечить более конкретный вопрос.