Я хотел бы использовать Pure Data в качестве инструмента прототипирования для моей собственной библиотеки. Я узнал, что патчи Pure Data написаны на C, но моя библиотека написана на C++. Итак, как я могу использовать этот код в чистых данных? Поскольку я не использовал простой C, я хотел бы знать, как я могу написать оболочку C для классов C++ и как тогда создавать экземпляры моих классов? Или мне нужно переписать все на C?
C-оболочка для C++
Ответы (4)
Вам нужно будет написать функции-оболочки для каждой функции, которую необходимо вызвать. Например:
// 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);
Обратите внимание, что это должен быть код C++. extern "C"
указывает, что функция использует соглашения об именах C.
void*
вы должны использовать неполную структуру, чтобы обеспечить некоторую безопасность типов.
- person David Heffernan; 07.10.2011
extern "Linkage_Specification" { //code }
таким образом компилятору сообщается спецификация Linkage, которую следует использовать при компоновке кода.
- person Alok Save; 07.10.2011
Позвольте мне сказать по-другому:
1) Вы можете вызывать функции, данные и библиотеки C из исходного кода C++, и вы вызываете исходный код C++ из C.
2) Однако всякий раз, когда C вызывает исходный код C++, этот исходный код должен быть записан в подмножестве C C++.
3) Частично это использует «extern C».
4) Другая часть использует "#ifdef __cplusplus"
5) Ссылки, которые я привел выше, содержат множество деталей.
6) Я просмотрел сайт Pure Data. Возможно, вам придется внести некоторые «настройки» в вашу библиотеку. Возможно, вы захотите создать новый заголовок. Но в целом, я думаю, вы, вероятно, можете достичь своей цели, интегрировав свою библиотеку с Pure Data.
ИМХО...
Вы также можете писать объекты для Pure Data с помощью C++, используя гибкую структуру.
Вы можете абсолютно точно вызывать C из C++ - без проблем!
В худшем случае вам, возможно, придется явно объявить те функции, которые вы вызываете из Pure Data, как «extern C». Но почти наверняка Pure Data уже сделал это за вас (вы, вероятно, увидите «extern C» в заголовочных файлах Pure Data.
Вот дополнительная информация:
http://msdn.microsoft.com/en-us/library/0603949d%28v=vs.80%29.aspx
'Надеюсь, это поможет!