Я пытаюсь вызвать некоторый код 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?
Спасибо!
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
Других решений пока нет …