如何使用inline-c包装将指针返回到自定义结构类型的函数?

我计划使用inline-c来包装C函数:

lxw_workbook  *workbook  = workbook_new("filename.xlsx");

我需要捕获返回的Ptr,以便以后在其他功能中使用。

问题: Ptr指向lxw_workbook,这是一个自定义结构。我是否需要为此Haskell类型编写一个存储实例? 因为如果我不直接使用该结构,而仅使用Ptr,可以跳过此步骤吗?

biyesheng630 回答:如何使用inline-c包装将指针返回到自定义结构类型的函数?

Ptr的type参数只是一个标记,以提醒您所指向的内容。类型不必为Storable或其他任何值。请注意,您的情况并不新颖; C标准库包含FILE之类的类型,它们只能像您一样通过指针访问。跟随他们的带领,您可以编写一个虚拟类型

data Workbook = Workbook -- constructor does not have to/should not be exported

然后您可以编写一个包含该类型的Context

import qualified Data.Map as M
import qualified Language.C.Inline.Context as C
import qualified Language.C.Inline.Types as C

lxwContext :: C.Context
lxwContext = mempty { ctxTypesTable = M.singleton (C.TypeName "lxw_workbook") [t| Workbook |] }

随后可以照常加载

import qualified Language.Inline.C as C

C.context (baseCtx <> lxwContext)

C.include "whatever.h" -- wherever you get workbook_new from

example :: IO (Ptr Workbook)
example = [C.exp| lxw_workbook* { workbook_new("filename.xlsx") } ]
本文链接:https://www.f2er.com/3169850.html

大家都在问