【发布时间】:2017-11-23 16:03:21
【问题描述】:
从 c2hs 文档中可以看出:
{#fun notebook_query_tab_label_packing as ^
`(NotebookClass nb, WidgetClass cld)' =>
{notebook `nb' ,
widget `cld' ,
alloca- `Bool' peekBool*,
alloca- `Bool' peekBool*,
alloca- `PackType' peekEnum*} -> `()'#}
在 Haskell 中生成
notebookQueryTabLabelPacking :: (NotebookClass nb, WidgetClass cld)
=> nb -> cld -> IO (Bool, Bool, PackType)
它绑定了以下 C 函数:
void gtk_notebook_query_tab_label_packing (GtkNotebook *notebook,
GtkWidget *child,
gboolean *expand,
gboolean *fill,
GtkPackType *pack_type);
问题:在这里我很困惑alloca- 对左侧的影响,即`Bool'。
现在我知道,在实践中,alloca 正在以某种方式生成 Ptr Bool,peekBool 可以将其转换为输出参数。但我非常困惑的是alloca 是如何做到这一点的,因为它的类型签名alloca :: Storable a => (Ptr a -> IO b) -> IO b。更具体地说:
问题1.当有人在Haskell中调用notebookQueryTabLabelPacking时,c2hs为alloca的第一个参数(Ptr a -> IO b)提供了什么参数?
问题2。 在这种情况下,alloca 的第一个参数(Ptr a -> IO b) 的具体类型签名是什么?是(Ptr CBool -> IO CBool)吗?
【问题讨论】: