c - 如何从名称与结构重合的 Swift 中调用 C 函数?

标签 c swift interop swift4.2

在 C 中,函数和结构有单独的命名空间。模块 Darwin 导出 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'

有什么方法可以告诉编译器我想要函数而不是初始化器吗?

最佳答案

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

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

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

关于c - 如何从名称与结构重合的 Swift 中调用 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55047018/

相关文章:

c - 尝试根据数字是否在数组中打印 1 或 2

c - pthread_mutex_errorcheck_np 初始化错误

c - 为什么不使用字符集格式的 scanf 在 for 循环中读取输入?

ios - 在 Swift 4 中显示 PDF 文件

ios - XCTestCase : UIApplication. shared.keyWindow 返回 nil

java - 获取方法调用者的机制

c - getsockopt 返回与 setsockopt 中设置的不同的 IP_TOS 值

xcode - 如何从 SWIFT 中的字符串获取 MD5 哈希并制作桥头

.net - 运行时可调用包装器 (RCW) 范围 - 进程域还是应用程序域?

c# - Microsoft Office Interop Excel - 指定 Excel 文件的名称