将文件作为参数传递给来自 Swift 的 C++ 方法
Passing a file as a parameter to a C++ method from Swift
我正在尝试在 Swift 应用程序中调用一些 C++ 代码。我没有编写 C++,也无法控制它。
我创建了一个 C++ 包装器来处理来自 Swift 的调用。我还在 C++ 文件中添加了一些测试函数,以验证我是从 Swift 调用 C++。这些函数只是 return 一个 int.
在C++header代码中有一个函数定义如下:
class GlobeProcessor {
public:
void readFile(ifstream &inputFile);
// ...
};
在我的包装器中,我定义了如下函数:
extern "C" void processGlobe(ifstream &file) {
GlobeProcessor().readFile(file);
}
令人困惑的部分是如何在我的桥接 header 中引用它。当前桥接 header 包含以下内容:
// test function
int getNumber(int num);
void processGlobeFile(ifstream &file);
测试函数成功,所以我可以从Swift访问C++。但是,将 processGlobeFile
的声明添加到桥接 header 会产生以下编译错误:
Unknown type name 'ifstream'
我尝试将适当的导入添加到桥接 header,但没有成功。我不是一个经验丰富的 C++ 人,所以我真的不知道我是否以正确的方式处理这个问题。有人可以帮助我了解如何将文件作为参数从 Swift 传递给 C++ 方法吗?
谢谢!
Swift 无法导入 C++。 ifstream
是 C++ class 并且参数也是 C++ 引用。这些都不适用于 Swift.
您必须编写一个 C 函数来包装您的 C++ 调用并将您的 ifstream
object 视为不透明引用。
此外,您的包装函数必须 声明 extern "C"
而不是仅以这种方式定义,否则包含 header 的其他 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
我正在尝试在 Swift 应用程序中调用一些 C++ 代码。我没有编写 C++,也无法控制它。
我创建了一个 C++ 包装器来处理来自 Swift 的调用。我还在 C++ 文件中添加了一些测试函数,以验证我是从 Swift 调用 C++。这些函数只是 return 一个 int.
在C++header代码中有一个函数定义如下:
class GlobeProcessor {
public:
void readFile(ifstream &inputFile);
// ...
};
在我的包装器中,我定义了如下函数:
extern "C" void processGlobe(ifstream &file) {
GlobeProcessor().readFile(file);
}
令人困惑的部分是如何在我的桥接 header 中引用它。当前桥接 header 包含以下内容:
// test function
int getNumber(int num);
void processGlobeFile(ifstream &file);
测试函数成功,所以我可以从Swift访问C++。但是,将 processGlobeFile
的声明添加到桥接 header 会产生以下编译错误:
Unknown type name 'ifstream'
我尝试将适当的导入添加到桥接 header,但没有成功。我不是一个经验丰富的 C++ 人,所以我真的不知道我是否以正确的方式处理这个问题。有人可以帮助我了解如何将文件作为参数从 Swift 传递给 C++ 方法吗?
谢谢!
Swift 无法导入 C++。 ifstream
是 C++ class 并且参数也是 C++ 引用。这些都不适用于 Swift.
您必须编写一个 C 函数来包装您的 C++ 调用并将您的 ifstream
object 视为不透明引用。
此外,您的包装函数必须 声明 extern "C"
而不是仅以这种方式定义,否则包含 header 的其他 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