Musisz „wrap” dysku C interfejs ++ ze zwykłych funkcji C, które mają parametr pozwala określić, jakie obiekt oni zostanie wezwany. Na przykład, jeśli masz w C++
class A
{
// .. boilerplate stuff...
int SomeMethod(int n, float f);
};
Następnie wraz z nim, można zadeklarować funkcji takich jak
extern "C" int A_SomeMethod(void* Obj, int n, float f)
{
return(((A*)Obj)->SomeMethod(n, f));
}
Jeśli nie jesteś dobrze z odlewania void *, można zaimplementuj mapę z nieprzezroczystego uchwytu do A*
. Ale najważniejsze jest, abyś trzymał się jakiegoś uchwytu/wskazówki do obiektu, do którego zostanie wywołana metoda. Aby uzyskać wskaźnik/uchwyt trzeba owinąć przydział do:
extern "C" void* A_Instantiate()
{
return new A;
}
katalogu C++ pliki powinny być opracowywane oddzielnie wzdłuż z pliku z funkcjami powyżej. Oddzielny dodatek do kompilacji C powinien zawierać deklaracje wszystkich powyższych funkcji.
EDYCJA: Ostrzeżenia i komentarze poniżej są ważne; aby odpowiedzieć na pytanie: "Tak, możliwe jest wywoływanie C++ z C", a to jest jedno podejście. To nie jest kompletne podejście, ponieważ nie ma na to mechanicznego sposobu, ale jest to początek. Nie należy również zapominać, aby utworzyć kolejną rozmowę-through dla delete
, itp, itd.
Dziękuję wilsonmichaelpatrick, ale co z użyciem * skompilowanego kodu * C++ w moim programie C ?! – S0H31L
Co to jest 'A', które było używane podczas rzucania' Obj' ?! Czy jest to predefiniowany typ lub struktura ?! – S0H31L
'A' jest typem klasy C++. Nawet przy skompilowanym kodzie C++ to podejście powinno działać. Wszystko, co musisz zrobić, to zdefiniować zewnętrzne metody "C" wzdłuż linii opisanych powyżej i użyć ich do połączenia się z twoim kodem C++. Sam kod C++ nie wymaga zmiany. – wilsonmichaelpatrick