я использую библиотеку обработки C ++ Audio для моего проекта Swift из https://www.surina.net/soundtouch/sourcecode.html
Я также включил эти файлы cpp в мои исходники компиляции на этапах Projects-target-build.
Когда я пытаюсь импортировать весь файл заголовка библиотеки в моем заголовке моста
#import "SoundTouch.h"
у меня ошибка при попытке скомпилировать
Unknown type of name 'namespace' in STTypes.h
'stdexcept' file not found
я использую пространство имен в моем заголовочном файле
namespace soundtouch { ... }
я не могу использовать несколько стандартных библиотек, как строки
#include <stdexcept>
#include <string>
что мне здесь не хватает?
Swift не понимает C ++ даже в заголовочных файлах. В C нет пространств имен, поэтому, когда компилятор Swift встречает слово namespace
он будет думать так же, как и компилятор C, это то, что это имя переменной. Это еще не все, хотя. Swift также не будет понимать другие ключевые слова C ++, такие как class
и при этом он не будет понимать искажение имен в стиле C ++, даже если он делает свое собственное искажение имен, ни export "C" { ... }
,
Если у вас есть заголовочный файл C ++, который вы хотите импортировать в Swift, вы должны убедиться, что все содержимое C ++ скрыто с #ifdef __cplusplus
точно так же, как если вы включаете заголовок в программу на Си. Кроме того, все объявления функций должны быть extern "C"
отключить искажение имени.
Вам понадобится альтернативное объявление для классов, вы можете использовать void*
или я нашел неполный struct
Тип работает достаточно хорошо, и вам нужно будет создать функции-оболочки C для вызова функций, определенных в классе. Может работать что-то вроде следующего (я не проверял это).
#if defined __cplusplus
extern "C" {
#endif
#if defiend __cplusplus
class Foo
{
void bar(int c);
}
#endif
struct FooHandle;
void Foo_bar(struct FooHandle* foo, int c);
#if defined __cplusplus
}
#endif
И вам нужно определить функцию shim в файле C ++
#include MyHeader.h
void Foo_bar(struct FooHandle* foo, int c)
{
((Foo*) foo)->bar(c);
}
Извиняюсь, если я неправильно понял C ++, я не использовал его всерьез с 1998 года
Других решений пока нет …