цель c — не может использовать пространство имен и не может включать стандартную библиотеку C ++ в мои файлы .h

я использую библиотеку обработки 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>

что мне здесь не хватает?

0

Решение

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 года

1

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

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

По вопросам рекламы [email protected]