我正在尝试使用以下签名从 Swift 调用 C 函数(一个外部 API):
extern void k(int, const char*, ...)
我这样调用 C 函数:
func send(query: String, args: CVarArg...) {
let query2 = UnsafeMutablePointer(mutating: query.cString(using: String.defaultCStringEncoding))
let result = k(0, query2, args)
}
但出现错误 'k' 不可用:Variadic 函数不可用
。
我不确定这是否可行,因为 C API 不接受 va_list
( http://swiftdoc.org/v3.1/protocol/CVarArg/ )。如果需要,我不介意用 C 编写包装函数。
最佳答案
您不能调用从中获取可变参数列表的 C 函数
swift 。您需要一个带有 va_list
参数的变体
(类似于 printf
和 vprintf
):
int kv(int n, const char *s, va_list args) {
// ...
}
原始函数k
可以转发到kv
:
int k(int n, const char* s, ...) {
va_list args;
va_start(args, s);
int result = kv(n, s, args);
va_end(args);
return result;
}
现在 kv
可以从 Swift 调用:
func send(query: String, args: CVarArg...) {
let result = withVaList(args) {
kv(0, query, $0)
}
}
(您可以将 Swift String
直接传递给采用
const char *
参数,编译器插入必要的代码到
创建一个临时表示为以 null 结尾的 C 字符串。)
关于swift - 从 Swift 调用 C 可变参数函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246862/