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

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


person Pedro    schedule 07.10.2011    source источник
comment
Несколько поздно, но я написал небольшое руководство по C-оболочке для C++: teddy.ch/c++ _library_in_c   -  person Teddy    schedule 14.11.2012


Ответы (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.

person Dark Falcon    schedule 07.10.2011
comment
Вместо использования void* вы должны использовать неполную структуру, чтобы обеспечить некоторую безопасность типов. - person David Heffernan; 07.10.2011
comment
Чтобы лучше понять, extern "Linkage_Specification" { //code } таким образом компилятору сообщается спецификация Linkage, которую следует использовать при компоновке кода. - person Alok Save; 07.10.2011
comment
Я не уверен, что полностью понимаю ваш пример. Если я объявлю эти внешние функции C в моем заголовке C++, почему я должен снова объявлять их в C? Разве я не могу просто включить заголовок C++ в свой файл C и напрямую вызывать функции? - person Pedro; 07.10.2011
comment
Если вы собираетесь писать код C, вам нужно объявление функции, чтобы компилятор C знал объявление функции. Если вы не вызываете его из C, вам не нужен заголовок. И это реализация C++ (.cpp), а не заголовок. Вы не можете включить первый блок кода из C, потому что C не понимает классы. - person Dark Falcon; 07.10.2011
comment
Обычно extern C сочетается с #ifdef __cplusplus. См. эту ссылку: dsc.sun.com/solaris/articles/mixing.html - person paulsm4; 07.10.2011
comment
Обертки также должны потреблять исключения и преобразовывать их в коды возврата. - person Matteo Italia; 07.10.2011
comment
Я понимаю часть объявления функций в C (это так же, как объявление собственного метода в java). Но как связать функции с c? Допустим, я начал новый проект и добавил путь к моим заголовкам C++ в каталоги включения. Будет ли это компилироваться без каких-либо дополнительных действий, если я адаптирую ваш пример? - person Pedro; 07.10.2011
comment
Вам нужно скомпилировать часть C++ в статическую или динамическую библиотеку и добавить ее в список библиотек, с которыми вы связываетесь в своей программе на C. - person Dark Falcon; 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.

ИМХО...

person paulsm4    schedule 07.10.2011

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

person Hans-Christoph Steiner    schedule 12.12.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

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

person paulsm4    schedule 07.10.2011
comment
Я думаю, что из Q ОП хочет вызвать С++ из C, а не наоборот. - person Alok Save; 07.10.2011
comment
Я хотел бы использовать его по-другому: вызов c++ из c. - person Pedro; 07.10.2011
comment
Но предположительно Pure Data, чем бы она ни была, знает только о C. - person David Heffernan; 07.10.2011