我需要知道如何使用 FFI 解决 Unions 和 Type**(例如 int**)?我知道我需要一个可存储的结构实例,我也可以将它用于联合吗?
像这样的工会:
typedef union {
int i;
char c;
} my_union;
这通常在 Haskell 中表示为:
data MyUnion = I CInt | C CChar
我的问题是你将如何将 myUnion 编组(定义一个可存储实例)到 my_union 中?我的理解是实例 my_union 会占用内存中的 sizeof(int) 个字节,即它的最大成员的大小。因此,为了存储它,我们将按照以下方式编写一些内容:
instance Storable myUnion where
size _ = #{size my_union} -- <-- hsc2hs shortcut
alignment _ = alignment undefined::CInt -- <-- What should this really be?
peek ptr = do -- <-- How are you supposed to know which element to extract?
poke ptr (I i) = poke ptr i -- <-- Or should this be #{poke my_union, i} ptr i ?
poke ptr (C c) = poke ptr c
另外,您如何代表int**
FFI?当我得到一个像int foo(int i1, int* i2);
签名这样的函数时:foo -> CInt -> Ptr CInt -> CInt
但如果有:int foo(int i1, int** i2);