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

时间:2018-01-18 20:08:26

标签: swift darwin

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

我该怎么做?

谢谢

2 个答案:

答案 0 :(得分:1)

是的,问题是var onClick = function(e) { map.off('click', onClick); var marker = L.marker(e.latlng,{draggable: true}).addTo(map); var lat = e.latlng.lat; var lon = e.latlng.lng; alert("Lat, Lon : " + lat + ", " + lon); }; map.on('click', onClick); major/minor被定义为非平凡的宏:

<sys/types.h>

因此在Swift中不可用。

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

#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); }

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

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

答案 1 :(得分:1)

dev_t是带符号的32位整数。 major返回最重要的8位,minor返回最低有效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