其他人已经讨论了如何从 Swift 调用 C 代码,并且效果很好。其他人还讨论了将 Swift 作为 C 代码的子例程调用是一个坏主意,因为需要设置整个 Swift 运行时。
但我的问题是:如果我的程序基于 Swift,并调用 C 子例程,但想为这些子例程提供回调,这可能吗?如果这些 C 子例程采用 C 兼容的类型参数(CInt 等),它们是否可以通过名称调用 Swift 例程?
另外,C 和 Swift 可以共享全局变量吗?朝任一方向?
执行此类操作的公认方法是将 swift 函数/闭包分配给 C 函数指针。
但如果你看一下 Swift 源代码,它使用了未记录的@_silgen_name
属性在几个地方给 swift 函数 C 兼容的名称,这样它们就可以直接从 C 和 C++ 调用
所以这有效(在 XCode 9 beta 中测试)
main.c
// declare the function. you would probably put this in a .h
int mySwiftFunc(int);
int main(int argc, const char * argv[]) {
int retVal = mySwiftFunc(42); // call swift function
printf("Hello from C: %d", retVal);
return 0;
}
SomeSwift.swift
@_silgen_name("mySwiftFunc") // give the function a C name
public func mySwiftFunc(number: Int) -> Int
{
print("Hello from Swift: \(number)")
return 69
}
但鉴于它没有记录,您可能不想使用它,而且它使用的函数签名和参数类型有点模糊。
ABI稳定性有人吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)