Ну, у меня нет опыта работы с ординалами (которые выглядят как некрасивые, специфичные для компилятора вещи), но я могу помочь вам сделать совместимый код C ++ / C.
Предположим, в C ++ ваш заголовочный файл выглядит так:
class MyClass
{
void foo(int);
int bar(int);
double bar(double);
void baz(MyClass);
};
Вы можете сделать его C-совместимым, выполнив следующие действия:
#ifdef __cplusplus
#define EXTERN_C extern "C"
// Class definition here; unchanged
#else
#define EXTERN_C
typedef struct MyClass MyClass;
#endif
EXTERN_C void MyClass_foo (MyClass*, int);
EXTERN_C int MyClass_bar_int (MyClass*, int);
EXTERN_C double MyClass_bar_double (MyClass*, double);
EXTERN_C void MyClass_baz (MyClass*, MyClass*);
В исходном файле C ++ вы просто определяете различные функции extern "C"
для передачи нужным функциям-членам, например так (это только одна; остальные работают аналогично)
extern "C" void MyClass_foo (MyClass* obj, int i)
{
obj->foo(i);
}
В этом случае код будет иметь интерфейс C без необходимости вообще изменять код C ++ (за исключением объявлений в заголовке; но они также могут быть перемещены в другой файл "myclass_c.h"
или тому подобное). Все функции, объявленные / определенные extern "C", не будут повреждены, поэтому вы можете легко выполнять другие операции с ними. Вы также, вероятно, захотите, чтобы функции создавали / уничтожали экземпляры MyClass (вы, конечно, можете использовать new
/ delete
для этого).