我试图将一个回调函数从swift-code传递给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版本中应该这么简单),我会收到错误。那么如何在swift中传递函数指针呢?我发现的所有方法都会导致错误。正如我所读到的,定义一个UnsafeMutablePointer对象的旧方法已经过时了,但它现在如何工作?我希望有类似的东西:
CPP-class.cpp:
void run_func(void * funcpntr()){
(*funcpntr)();
}
CPP-class.hpp:
void run_func(void *);
(SWIFT伪代码):
run_func(testfunc())
或者是否有更好的解决方案从包装的cpp代码运行swift-functions?
任何帮助都会非常感激。提前致谢
答案 0 :(得分:1)
首先,您需要在.cpp / .hpp中正确声明函数类型。
的.cpp:
void run_func(void (* funcpntr)()) {
(*funcpntr)();
}
.HPP:
void run_func(void (* funcpntr)());
(您可以省略后者funcpntr
,如Jarod42的答案所示。这需要包含在extern "C" {...}
中,如第一个&#34; cpp-class.hpp所示:&#34)
和斯威夫特方面:
功能定义:
//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 {
//...
}
答案 1 :(得分:0)
签名将是
void run_func(void (*)()); // Declaration
// Definition
void run_func(void (*funcpntr)()) {
(*funcpntr)();
}
使用
void testfunc();
run_func(&testfunc);