2011-10-07 12 views
13

Chciałbym użyć Pure Data jako narzędzia do tworzenia prototypów dla mojej własnej biblioteki. Dowiedziałem się, że łatki Pure Data są napisane w języku C, ale moja biblioteka jest napisana w C++. Więc jak mogę użyć tego kodu w czystych danych? Ponieważ nie używałem zwykłego C, chciałbym wiedzieć, w jaki sposób mogę napisać opakowanie C dla klas C++ i jak tworzyć instancje? Czy muszę przepisać wszystko w C?C Wrapper dla C++

+5

Nieco późno, ale napisałem mały poradnik na temat C-owcy dla C++: http://www.teddy.ch/c++_library_in_c/ – Teddy

Odpowiedz

21

Musisz napisać funkcje otoki dla każdej funkcji, która musi być wywołana na przykład:!.

// The C++ implementation 
class SomeObj { void func(int); }; 

extern "C" { 
    SomeObj* newSomeObj() {return new SomeObj();} 
    void freeSomeObj(SomeObj* obj) {delete obj;} 
    void SomeObj_func(SomeObj* obj, int param) {obj->func(param)} 
} 

// The C interface 
typedef struct SomeObjHandle SomeObj; 

SomeObj* newSomeObj(); 
void freeSomeObj(SomeObj* obj); 
void SomeObj_func(SomeObj* obj, int param); 

Uwaga thi s musi być w C++. Parametr extern "C" określa, że ​​funkcja używa konwencji nazewnictwa C.

+6

Zamiast używać 'void *' powinieneś użyć niekompletnej struktury, aby uzyskać pewne bezpieczeństwo. –

+1

Aby lepiej zrozumieć, 'extern 'Linkage_Specification" {// code} 'W ten sposób przekazujemy kompilatorowi specyfikację Linkage do użycia podczas łączenia kodu. –

+0

Nie jestem pewien, czy rozumiem twój przykład całkowicie. Jeśli deklaruję te zewnętrzne funkcje "C" w nagłówku C++, dlaczego muszę zadeklarować go ponownie w C? Czy nie mogę po prostu dołączyć nagłówka C++ do mojego pliku C i wywołać funkcje bezpośrednio? – Pedro

1

Możesz całkowicie zadzwonić do C z C++ - nie ma problemu!

W najgorszym przypadku może być konieczne jawne zadeklarowanie funkcji, które wywołujesz z Pure Data, jako "extern C". Ale to jest prawie pewne, że dane Czysta już zrobił to za Ciebie (prawdopodobnie zobaczysz „extern C” w czystej plików nagłówkowych danych

Oto więcej informacji.

http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx

„Mam nadzieję, że pomaga

+0

Myślę, że z Q OP chce wywołać C++ z C, a nie w inny sposób. –

+0

Chciałbym użyć go w inny sposób: wywołanie C++ z c. – Pedro

+0

Ale prawdopodobnie Pure Data, cokolwiek to jest, wie tylko o C. –

2

Ujmę to inaczej:

1) Możesz zadzwonić C funkcje, danych i bibliotek z C++ źródła i zadzwonić C++ źródło z C

2) Ilekroć C nazywa się C++ źródło jednak to źródło musi być napisane w C z podzbioru C++.

3) Część tego używa "extern C".

4) Inna część jest za pomocą "ifdef __cplusplus"

5) związek, że wymienione wyżej wymienione wiele szczegółów

6), że wyglądały na Pure Data site. Być może będziesz musiał dokonać pewnych "poprawek" w swojej bibliotece. Możesz chcieć utworzyć nowy nagłówek. Ale zasadniczo myślę, że prawdopodobnie osiągniesz swój cel, jakim jest doprowadzenie biblioteki do integracji z Pure Data.

IMHO ...

2

Można również napisać obiektów dla danych Czystych wykorzystaniem C++ przy użyciu flext framework.