Оболочка C для C ++ - PullRequest
       24

Оболочка C для C ++

16 голосов
/ 07 октября 2011

Я бы хотел использовать Pure Data в качестве инструмента для создания прототипов для моей собственной библиотеки.Я обнаружил, что патчи Pure Data написаны на C, но моя библиотека написана на C ++.Итак, как я могу использовать этот код в чистых данных?Поскольку я не использовал простой C, я хотел бы знать, как я могу написать оболочку C для классов C ++ и как тогда создавать экземпляры моих классов?Или я должен все переписать на C?

Ответы [ 4 ]

25 голосов
/ 07 октября 2011

Вам нужно будет написать функции-оболочки для каждой функции, которую нужно вызвать.Например:

// 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.

2 голосов
/ 12 декабря 2011

Вы также можете писать объекты для Pure Data, используя C ++, используя flext framework .

2 голосов
/ 07 октября 2011

Позвольте мне сказать по-другому:

1) Вы можете вызывать функции C, данные и библиотеки из источника C ++, а также вызывать источник C ++ из C.

2) Всякий раз, когда C вызываетоднако в источник C ++ этот источник должен быть записан в подмножество C языка C ++.

3) Часть этого использует "extern C".

4) Другая часть использует "#ifdef __cplusplus "

5) Ссылки, которые я привел выше, дают множество деталей

6) Я посмотрел на Pure Data site .Возможно, вам придется сделать некоторые "настройки" в вашей библиотеке.Возможно, вы захотите создать новый заголовок.Но в целом я думаю, что вы, вероятно, сможете достичь своей цели, чтобы ваша библиотека интегрировалась с Pure Data.

ИМХО ...

1 голос
/ 07 октября 2011

Вы можете абсолютно позвонить 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

Надеюсь, это поможет!

...