我正在尝试将回调函数从 swift 代码传递到 C++ 代码。我正在使用当前版本的 Xcode。它适用于简单变量,但目前不适用于函数:
cpp-class.cpp:
bool * swiftvar;
void register_var(bool * varpntr){
swiftvar = varpntr;
cout<<"registered"<<endl;
}
void switch_var(){
*swiftvar = !(*swiftvar);
cout<<"switched"<<endl;
}
cpp-class.hpp:
#ifdef __cplusplus
extern "C"{
#endif
void register_var(bool *);
void switch_var();
#ifdef __cplusplus
}
#endif
并 swift :
register_var(&testbool)
print(testbool)
switch_var()
print(testbool)
如果我对函数尝试相同的方法(据我所知,在当前的 swift 版本中应该是那么简单),我会得到错误。那么我该如何快速传递函数指针呢?我发现的所有方法都会导致错误。正如我所读,定义 UnsafeMutablePointer 对象等的旧方法已经过时,但它现在如何工作?我希望是这样的:
cpp-class.cpp:
void run_func(void * funcpntr()){
(*funcpntr)();
}
cpp-class.hpp:
void run_func(void *);
(快速伪代码):
run_func(testfunc())
或者是否有更好的解决方案来从包装的 cpp 代码运行 swift-functions?
任何帮助将不胜感激。提前致谢
最佳答案
首先,您需要在.cpp/.hpp 中正确声明函数类型。
.cpp:
void run_func(void (* funcpntr)()) {
(*funcpntr)();
}
.hpp:
void run_func(void (* funcpntr)());
(您可以省略后者 funcpntr
,如 Jarod42 的回答所示。这需要包含在 extern "C"{...}
中,如首先是“cpp-class.hpp:”。)
和 Swift 方面:
函数定义:
//This needs to be a toplevel function, which means it cannot be a method.
func test_func() {
//...
}
将其传递给 run_func()
:
run_func(test_func)
或者您可以将闭包传递给 run_func
:
//This closure cannot have captured variables.
run_func {
//...
}
关于c++ - 如何正确地将回调函数从 swift 传递到 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148929/