C2HS指针类型对应

时间:2018-07-20 20:39:15

标签: pointers haskell ffi c2hs

我对C2HS如何从{#pointer …}声明生成类型对应关系有一些概念性的问题。首先,让~表示C类型和Haskell类型之间的类型对应运算符。那说对了

{#pointer *CTypeName as HaskellName newtype#}

生成通信*CTypeName ~ HaskellName,而

{#pointer *CTypeName as HaskellName foreign newtype#}

生成对应关系*CTypeName ~ (Ptr HaskellName)? (如果是这样,这是否意味着在后一种情况下CTypeName ~ HaskellName也是如此?)

尽管事实是C2HS为每个不同的声明生成略有不同的类型定义:

-- {#pointer *CTypeName as HaskellName newtype#}
data HaskellName = HaskellName (Ptr HaskellName)

-- {#pointer *CTypeName as HaskellName foreign newtype#}
data HaskellName = HaskellName (ForeignPtr HaskellName)

我上面提到的~对应关系是由GHC / C2HS在后台执行的,它们仅用于使foreign import … FFI声明更安全。如果不是写{#pointer ...}声明,而是写上面生成的data HaskellName ..声明(即,不使用C2HS),那么GHC不会强制执行C到Haskell类型的关联(我假设)。

最后,如果我们删除上述*声明中的{#pointer …}字符,那么我们将不再具有*CTypeName ~ HaskellName*CTypeName ~ (Ptr HaskellName)之间的类型对应关系,而将具有类型对应关系在CTypeName ~ HaskellNameCTypeName ~ (Ptr HaskellName)之间。

我所有的理解正确吗?

0 个答案:

没有答案