Вызов функции класса "С++" из кода "C"

Как мы можем назвать функции класса класса "С++" в коде "C"?

У меня есть два файла .cpp, в которых я определил некоторые классы с функциями-членами и соответствующими ".h" файлами, в которые были включены некоторые другие файлы cpp/h.

Теперь я хочу назвать эти функции файлов CPP в файле "C". Как я могу это сделать?

Ответы

Ответ 1

C не имеет понятия thiscall. Соглашение о вызове C не позволяет напрямую вызывать функции членов объекта С++.

Для этого вам необходимо предоставить API-интерфейс обертки вокруг вашего объекта С++, который явно принимает указатель this, а не неявно.

Пример:

// C.hpp
// uses C++ calling convention
class C {
public:
   bool foo( int arg );
};

API-интерфейс обертки:

// api.h
// uses C calling convention
#ifdef __cplusplus
extern "C" {
#endif

void* C_Create();
void C_Destroy( void* thisC );
bool C_foo( void* thisC, int arg );

#ifdef __cplusplus
}
#endif

Ваш API будет реализован в С++:

#include "api.h"
#include "C.hpp"

void* C_Create() { return new C(); }
void C_Destroy( void* thisC ) {
   delete static_cast<C*>(thisC);
}
bool C_foo( void* thisC, int arg ) {
   return static_cast<C*>(thisC)->foo( arg );
}

Там также много отличной документации. Первый Я столкнулся с, можно найти здесь.