如何从Swift调用名称与结构一致的C函数?

时间:2019-03-07 15:09:25

标签: c swift interop swift4.2

在C中,函数和结构都有单独的命名空间。达尔文模块会同时导出struct flockfunc flock。如果我尝试调用该函数,则编译器会将名称解析为结构初始化程序:

let result: Int32 = Darwin.flock(fd, LOCK_EX)
                           ^^^^^
                           Cannot invoke initializer
                           for type 'flock' with an argument list
                           of type '(Int32, Int32)'

如果我尝试通过命名导入手动解析名称,我仍然会收到错误消息:

import func Darwin.flock
            ^^^^^^^^^^^^
            Ambiguous name 'flock' in module 'Darwin'

对于函数的引用也没有运气:

let functionNotStruct: (Int32, Int32) -> Int32 = Darwin.flock
                       ^^^^^^^^^^^^^^^^^^^^^^^
                       Cannot convert value of type 'flock.Type'
                       to specified type '(Int32, Int32) -> Int32'

有什么办法告诉编译器我想要该函数而不是初始化程序吗?

1 个答案:

答案 0 :(得分:2)

我无法解释为什么会有所不同,但是省略模块名称使其可以编译:

// Call `flock()`:
let result = flock(fd, LOCK_EX)

// Use `struct flock`:
var fl = flock()
fl.l_start = 0