不能使用命名空间,不能在我的.h文件中包含标准C ++库

时间:2017-12-13 08:20:56

标签: c++ objective-c swift xcode9 soundtouch

我正在使用来自https://www.surina.net/soundtouch/sourcecode.html

的Swift项目的C ++音频处理库

我还在Projects-targets-build阶段的编译源中包含了那些cpp文件。

当我尝试在我的桥接标题中导入所有库头文件时

#import "SoundTouch.h"

我在尝试编译时遇到错误

Unknown type of name 'namespace' in STTypes.h
'stdexcept' file not found

我在头文件中使用命名空间

namespace soundtouch { ... } 

我不能使用几个标准库也像字符串

#include <stdexcept>
#include <string>

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

即使在头文件中,Swift也不理解C ++。 C没有名称空间,所以当Swift编译器遇到单词namespace时,它会认为与C编译器相同,这就是它是变量的名称。但事实并非如此。 Swift也不会理解其他C ++关键字,如class,也不会理解C ++样式名称修改,即使它有自己的名称,也不是export "C" { ... }

如果您要将C ++头文件导入Swift,则必须确保所有C ++内容都隐藏在#ifdef __cplusplus中,就像在C程序中包含头一样。此外,所有函数声明都需要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

您需要在C ++文件中定义填充函数

#include MyHeader.h

void Foo_bar(struct FooHandle* foo, int c)
{
    ((Foo*) foo)->bar(c);
}

道歉,如果我弄错了C ++,我自1998年以来就没有认真对待它