如何使用 Swift 在 dev_t 上调用 major 或 minor

How to call major or minor on dev_t using Swift

我获得了一个 dev_t 类型的值,我想访问它的主要和次要版本号,不幸的是,在 C 中你会调用 major(theValue)minor(theValue)它们没有在 Swift 中定义(可能是因为它们只是宏?)。

我应该怎么做?

谢谢

是的,问题是 major/minor<sys/types.h> 中被定义为非平凡的宏:

#define major(x)        ((int32_t)(((u_int32_t)(x) >> 24) & 0xff))
#define minor(x)        ((int32_t)((x) & 0xffffff))

因此在 Swift 中不可用。

一个可能的解决方案是定义辅助函数 在桥接头文件中(宏可用):

#include <sys/types.h>

static inline int32_t dev_major(dev_t x) { return major(x); }
static inline int32_t dev_minor(dev_t x) { return minor(x); }

然后可以从 Swift 使用这些:

func foo(device: dev_t) {
    let ma = dev_major(device)
    let mi = dev_minor(device)
}

在Linux上可以调用Glibc中相应的库函数:

func foo(device: dev_t) {
    let ma = gnu_dev_major(UInt64(device))
    let mi = gnu_dev_minor(UInt64(device))
}

dev_t 是一个带符号的 32 位整数。 major returns 最高有效 8 位和 minor returns 最低有效 24 位。

let x: dev_t = 0x12345678

func major(_ x: dev_t) -> Int32 {
    return (x >> 24) & 0xff
}

func minor(_ x: dev_t) -> Int32 {
    return x & 0xffffff
}

print(String(major(x), radix: 16))
print(String(minor(x), radix: 16))

输出:

12
345678