c++ - 如何正确地将回调函数从 swift 传递到 C++?

标签 c++ swift pointers callback

我正在尝试将回调函数从 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/

相关文章:

c++ - Xcode9 领域错误 - 没有可行的重载 ‘=’

ios - 如何从一个 View Controller 设置结构变量数据并从另一个 View Controller 获取相同的值

Swift 类和函数

c - 将多维数组作为指向 C 中函数的指针传递会产生意想不到的结果

C - 字符数组的数组

c++ - 霍夫曼编码没有查找表的单个字符

c++ - 捕获列表中捕获的行为 [c++]

c++ - "this"指针有什么问题?

c++ - 无法在 cmake 中包含外部先前构建的 .a 库

ios - 如何使用 xcassets 构建框架