Haskell:如何获取 #define-d 常量的值?
在 Haskell 程序中,使用 C 头文件中定义的常量的最佳方法是什么?
In a Haskell program, what's the best way to use constants defined in C headers?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于此任务,hsc2hs 是您的朋友。
举一个简单的例子,让我们从
获取
。INT_MAX
的值限制.h借助 hsc2hs,我们可以使用
#include
标头并通过#const
指令使用常量值。使用 Cabal 代替手动构建:
请注意,即使主程序的名称是
IntMax.hsc
,Main-Is
行也指向IntMax。 HS
。 当 Cabal 查找IntMax.hs
但找到IntMax.hsc
时,它会在构建过程中自动通过 hsc2hs 提供后者。请注意,您需要用多个常量来分解行。 假设您正在组装一个位字段以传递给 FormatMessage。 您需要将其写为
将它们全部放在一行上会导致语法错误。
For this task, hsc2hs is your friend.
For a simple example, let's get the value of
INT_MAX
fromlimits.h
.With hsc2hs, we can
#include
headers and use the values of constants with the#const
directive.Instead of building by hand, use Cabal:
Notice that even though the name of the main program is
IntMax.hsc
, theMain-Is
line points toIntMax.hs
. When Cabal looks forIntMax.hs
but findsIntMax.hsc
, it automatically feeds the latter through hsc2hs as part of the build.Note that you'll want to break up lines with multiple constants. Say you're assembling a bitfield to pass to FormatMessage. You'll want to write it as
Putting them all on one line will result in syntax errors.
GHC 正在尽可能地从
-fvia-c
转向-fasm
。一个副作用是,即使在
-fvia-c
模式下,您的程序也可能在不使用任何 C 头文件的情况下进行编译,以确保编译结果在功能上与中的 GHC 相同-fasm
模式。因此,有必要使用
hsc2hs
、c2hs
或在 GHC 编译源代码之前运行的其他预处理器。c2hs
本身支持enum
常量...已经有一段时间了,但我认为这样的事情是正确的。#define
的常量比较棘手。 我总是只是内联复制它们,或者使用额外的 C 将 then 转换为枚举或 const 变量。GHC is moving away from
-fvia-c
and towards-fasm
wherever possible.One side effect is that your program may be compiled without using any C headers at all, even in
-fvia-c
mode, in order to ensure that the compilation results are functionally identical to GHC in-fasm
mode.Thus it is necessary to use
hsc2hs
,c2hs
, or other preprocessors run before GHC compiles sources.c2hs
natively supportsenum
constants... it's been a while, but I think something like this is right.#define
'd constants are a tick trickier. I've always just copied them inline, or used additional C to transform then into enums or const variables.