什么是hsc2hs和c2hs之间的区别?
我知道hsc2hs是一个预处理器,但它具体做了什么?
c2hs可以从C代码生成Haskell模块,但我是否需要hsc2hs来完成这个操作?
我何时应该使用c2hs? 有许多Haskell预处理器; 您应该使用哪个?描述上述层次结构的一种简短(且有些不准确)方法是,您越往下走,就越少需要编写样板文件,同时需要阅读的文档越多;因此,我听说过对于小型FFI项目,应该使用hsc2hs,而对于较大的项目,则更适合使用c2hs。
c2hs支持的hsc2hs不支持的功能:
- 基于C头文件的内容自动生成外部导入
- 半自动地进行函数调用的编组和解组,并
- 将指针类型和层次结构转换为Haskell类型。
Mikhail 的回答很好,但还有另一方面。hsc2hs 提供了 c2hs 不具备的功能,有时需要同时使用两者。
值得注意的是,hsc2hs 通过生成一个 C 可执行文件来生成 Haskell 代码,而 c2hs 直接解析头文件。因此,hsc2hs 允许您访问 #define
等内容。虽然我发现 c2hs 更适合生成绑定和包装器以及对复杂的 C 结构进行“深入”查看和修改,但它不适合访问常量和枚举,只能自动化 Storable 实例的样板代码。在我的情况中,尤其是对于预定义常量,我发现必须与 bindings-dsl 包 [1] 一起使用 hsc2hs。例如,在一个实例中,我有一个 hsc 文件用于大量常量,一个 chs 文件用于包装使用这些常量的函数。