#c #c #wrapper #puredata
#c #c #оболочка #puredata
Вопрос:
Я хотел бы использовать чистые данные в качестве инструмента прототипирования для моей собственной библиотеки. Я обнаружил, что чистые исправления данных написаны на C, но моя библиотека написана на C . Итак, как я могу использовать этот код в чистых данных? Поскольку я не использовал обычный C, я хотел бы знать, как я мог бы написать оболочку C для классов C и как тогда создавать экземпляры моих классов? Или мне нужно все переписать на C?
Комментарии:
1. Несколько поздно, но я написал небольшое руководство о оболочке C для C : teddy.ch/c _library_in_c
Ответ №1:
Вам нужно будет написать функции-оболочки для каждой функции, которую необходимо вызвать. Например:
// 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.
Комментарии:
1. Вместо использования
void*
вы должны использовать неполную структуру, чтобы получить некоторую безопасность типов.2. Чтобы лучше понять,
extern "Linkage_Specification" { //code }
таким образом, компилятору сообщается спецификация компоновки, которую следует использовать при компоновке кода.3. Я не уверен, что полностью понимаю ваш пример. Если я объявляю эти внешние функции «C» в своем заголовке c , почему я должен снова объявлять их на C? Разве я не могу просто включить заголовок c в свой файл C и вызвать функции напрямую?
4. Обычно «внешний C» соединяется с «#ifdef __cplusplus». Смотрите эту ссылку: dsc.sun.com/solaris/articles/mixing.html
5. Оболочки также должны «использовать исключения» и преобразовывать их в коды возврата.
Ответ №2:
Вы также можете писать объекты для чистых данных, используя C , используя фреймворк flext.
Ответ №3:
Позвольте мне выразить это по-другому:
1) Вы можете вызывать функции, данные и библиотеки C из исходного кода C , и вы вызываете исходный код C из C.
2) Однако всякий раз, когда C обращается к источнику C , этот источник должен быть записан в подмножестве C C .
3) Частью этого является использование «внешнего C».
4) Другая часть использует «#ifdef __cplusplus»
5) Ссылки, которые я привел выше, дают множество подробностей
6) Я посмотрел на сайт чистых данных. Возможно, вам придется внести некоторые «изменения» в вашу библиотеку. Возможно, вы захотите создать новый заголовок. Но, по сути, я думаю, вы, вероятно, сможете достичь своей цели — интегрировать свою библиотеку с чистыми данными.
ИМХО…
Ответ №4:
Вы можете абсолютно точно вызвать C из C — никаких проблем!
В худшем случае вам, возможно, придется явно объявлять те функции, которые вы вызываете из чистых данных, как «внешние C». Но почти наверняка Pure Data уже сделала это за вас (вероятно, вы увидите «extern C» в файлах заголовков Pure Data.
Вот дополнительная информация:
http://msdn.microsoft.com/en-us/library/0603949d(v=vs.80).aspx
«Надеюсь, это поможет!
Комментарии:
1. Я думаю, что из Q OP хочет вызвать C из C, а не наоборот.
2. Я бы хотел использовать его другим способом: вызвать c из c.
3. Но, по-видимому, чистые данные, что бы это ни было, знают только о C.