가능한 경우 클래스가 구조체에서 파생되도록하십시오. 그런 다음 C 코드에서이 구조체에 대한 포인터를 사용할 수 있습니다
// C++ code
extern "C" struct Cfoo {};
extern "C" struct Cbar {};
class foo : public Cfoo {};
class bar : public Cbar {};
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
그것은 그러나 GCC는 적어도 다른 종류의 포인터 사이의 변환에 대해 경고, 엄격 오류가 아니다. 당신이 상속 할 수없는 경우
void foo (void) {
struct Cfoo * pf;
struct Cbar * pb;
pf = pb; // gcc warns
}
후 비슷한 아이디어를 사용하지만 C 구조 저장소에게 C++ 객체에 대한 포인터를 가지고 있고, 또 단지 앞으로 C API의 구조를 선언
// C++ code
class foo {};
class bar {};
extern "C" struct Cfoo { foo * pFoo; };
extern "C" struct Cbar { bar * pBar; };
// C API
extern "C" {
struct Cfoo;
struct Cbar;
}
여기서 단점은 Cfoo 및 Cbar 객체의 수명을 관리해야한다는 것입니다.
Lisp과 관련이 있는지 물어봐도 될까요? – Svante
이것은 C++ 클래스를 Common Lisp에 노출시키는보다 일반적인 질문의 일부입니다. CFFI (또는 Lisp 구현에 종속적 인 FFI)입니다. –