其他人已经讨论了如何从 Swift 调用 C 代码,而且效果很好。其他人还讨论了如何将 Swift 作为 C 代码的子例程调用是一个坏主意,因为需要设置整个 Swift 运行时。
但这是我的问题:如果我的程序基于 Swift,并调用 C 子程序,但想为这些子程序提供回调,这可能吗?那些 C 子例程是否可以通过名称调用 Swift 例程,前提是它们采用与 C 兼容的类型化参数(CInt 等)?
还有,C和Swift可以共享全局变量吗?朝哪个方向?
最佳答案
做这种事情的批准方法是将 swift 函数/闭包分配给 C 函数指针。
但是如果你看一下 Swift 源代码,它在几个地方使用了未记录的 @_silgen_name
属性来赋予 swift 函数 C 兼容的名称,因此它们可以直接从 C 和 C++ 调用
所以这有效(在 XCode 9 beta 中测试)
主.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 稳定性有人吗??
关于c - Swift调用C调用Swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43672263/