如何使用 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
我获得了一个 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