ios — передача файла в качестве параметра методу C ++ из Swift

Я пытаюсь вызвать некоторый код C ++ в приложении Swift. Я не писал на C ++ и не имею над ним контроля.

Я создал оболочку C ++ для обработки вызовов из Swift. Я также добавил некоторые тестовые функции в файлы C ++, чтобы убедиться, что я вызываю C ++ из Swift. Эти функции просто возвращают int.

В коде заголовка C ++ есть функция, определенная следующим образом:

class GlobeProcessor {
public:
void readFile(ifstream &inputFile);
// ...
};

В моей оболочке я определил функцию следующим образом:

extern "C" void processGlobe(ifstream &file) {
GlobeProcessor().readFile(file);
}

Запутанная часть состоит в том, как сослаться на это в моем соединительном заголовке. В настоящее время соединительный заголовок содержит следующее:

// test function
int getNumber(int num);

void processGlobeFile(ifstream &file);

Тестовая функция выполнена успешно, поэтому я могу получить доступ к C ++ из Swift. Тем не менее, добавив объявление для processGlobeFileк соединительному заголовку выдает следующую ошибку компиляции:

Unknown type name 'ifstream'

Я безуспешно пытался добавить соответствующий импорт в заголовок моста. Я не опытный C ++ парень, поэтому я не знаю, правильно ли я к этому отношусь. Может кто-нибудь помочь мне понять, как передать файл в качестве параметра в метод C ++ из Swift?

Спасибо!

2

Решение

Swift не может импортировать C ++. ifstream является классом C ++, а параметр также является ссылкой C ++. Ни один из них не будет работать со Swift.

Вы должны написать функцию C, которая упаковывает ваш вызов C ++ и обрабатывает ваш ifstream объект как непрозрачная ссылка.

Также ваша функция обертки должна быть объявленный extern "C" не просто так определено, в противном случае другие файлы C ++, которые содержат заголовок, будут предполагать, что он имеет искажение имени.

Нечто подобное может сработать, но я его вообще не проверял:

// header
#if !defined _cplusplus

typedef struct ifstream ifstream; // incomplete struct def for C opaque type

#else

extern "C" {

#endif

int getNumber(int num);

void processGlobeFile(ifstream *file); // note you need to use a pointer not a reference

#if defined __cplusplus

} // of the exten C

#endif
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector