从Swift调用C函数,只知道内存地址

从Swift调用C函数,只知道内存地址,c,swift,callback,language-interoperability,C,Swift,Callback,Language Interoperability,我在C中有一个非常简单的函数,它的指针被传递到Swift中 void callback() { NSLog(@"such pointer…"); } 如何仅使用指针在Swift中调用它?这不是简单地调用它,而是直接调用它就可以了。尝试了以下不同版本的签名铸造,但总是崩溃: let pointer: UnsafePointer<@convention(c)() -> ()> = UnsafePointer(bitPattern: …) let callback: @co

我在C中有一个非常简单的函数,它的指针被传递到Swift中

void callback() {
    NSLog(@"such pointer…");
}
如何仅使用指针在Swift中调用它?这不是简单地调用它,而是直接调用它就可以了。尝试了以下不同版本的签名铸造,但总是崩溃:

let pointer: UnsafePointer<@convention(c)() -> ()> = UnsafePointer(bitPattern: …)
let callback: @convention(c)() -> () = pointer.memory
Swift.print(callback) // (Function)
callback() // Handling crash with signal 11...
为了检查它是否实际工作并指向正确的地址,我有另一个Objective-C函数,当使用回调指针从Swift调用时,该函数会按预期工作

void invokeCallback(uintptr_t callback) {
    ((void (*)()) callback)(); // such pointer…
}
与中相同的方法应该在这里起作用

Swift 3示例(假设
funcPtr
UnsafeRawPointer
包含函数地址):

当然,类型别名必须与实际函数签名匹配, 函数需要是一个“纯”C函数(而不是Objective-C)
方法)。

如何获取指针?它的定义/声明是什么?哈,我尝试了各种各样的随机狗屎试图弄明白这一点
@convention(c)
是最重要的,我已经看到了你关于
unsafeBitCast
的一些答案,可惜你没有先尝试。这是救命恩人。谢谢你,马丁!
void invokeCallback(uintptr_t callback) {
    ((void (*)()) callback)(); // such pointer…
}
// Define function type:
typealias callbackFunc = @convention(c) () -> Void

// Convert pointer to function type:
let callback = unsafeBitCast(funcPtr, to: callbackFunc.self)

// Call function:
callback()