swift - 从 Swift 调用 C 可变参数函数

标签 swift variadic-functions

我正在尝试使用以下签名从 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 参数的变体 (类似于 printfvprintf):

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/

相关文章:

ios - Swift UINavigationBar 背景颜色与主要颜色不同

SwiftUI:更新由其他 @State 变量组成的 @Binding 变量的最佳方式

swift - 是否可以从 SwiftUI 使用 ASWebAuthenticationSession ?

c++ - 根据函数指针参数拆分多个可变参数模板包

python - 如何在 Python 中使用可变参数构造动态函数调用

java - 为什么不能将 @SafeVarags 应用于最终类中的实例方法?

ios - Swift/UITableView 将随机行插入到部分以发布 AdMob 广告

ios - Firebase 的新手和 swift。无法将 Firebase 连接到 Xcode

c++ - 如何调用所有可变继承类的函数?

java - 如何使用来自可变参数方法的附加参数调用可变参数方法