Haskell:如何获取 #define-d 常量的值?

发布于 2024-07-24 13:04:33 字数 44 浏览 5 评论 0原文

在 Haskell 程序中,使用 C 头文件中定义的常量的最佳方法是什么?

In a Haskell program, what's the best way to use constants defined in C headers?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你在我安 2024-07-31 13:04:33

对于此任务,hsc2hs 是您的朋友。

举一个简单的例子,让我们从 获取 INT_MAX 的值限制.h

$ cat >IntMax.hsc
module Main where

#include <limits.h>

c_INT_MAX = #const INT_MAX

main = print c_INT_MAX

借助 hsc2hs,我们可以使用 #include 标头并通过 #const 指令使用常量值。

使用 Cabal 代替手动构建:

$ cat >intmax.cabal
Name:          intmax
Version:       0.0
Cabal-Version: >=1.2
Build-Type:    Simple

Executable intmax
  Main-Is: IntMax.hs
  Build-Depends: base

请注意,即使主程序的名称是 IntMax.hscMain-Is 行也指向 IntMax。 HS。 当 Cabal 查找 IntMax.hs 但找到 IntMax.hsc 时,它会在构建过程中自动通过 hsc2hs 提供后者。

$ cabal configure
Resolving dependencies...
Configuring intmax-0.0...

$ cabal build
Prerocessing executables for intmax-0.0...
Building intmax-0.0...
[1 of 1] Compiling Main             ( dist\build\intmax\intmax-tmp\IntMax.hs, dist\build\intmax\intmax-tmp\Main.o )
Linking dist\build\intmax\intmax.exe ...

$ ./dist/build/intmax/intmax
2147483647

请注意,您需要用多个常量来分解行。 假设您正在组装一个位字段以传递给 FormatMessage。 您需要将其写为

flags = #const FORMAT_MESSAGE_FROM_SYSTEM
        .|.
        #const FORMAT_MESSAGE_IGNORE_INSERTS

将它们全部放在一行上会导致语法错误。

For this task, hsc2hs is your friend.

For a simple example, let's get the value of INT_MAX from limits.h.

$ cat >IntMax.hsc
module Main where

#include <limits.h>

c_INT_MAX = #const INT_MAX

main = print c_INT_MAX

With hsc2hs, we can #include headers and use the values of constants with the #const directive.

Instead of building by hand, use Cabal:

$ cat >intmax.cabal
Name:          intmax
Version:       0.0
Cabal-Version: >=1.2
Build-Type:    Simple

Executable intmax
  Main-Is: IntMax.hs
  Build-Depends: base

Notice that even though the name of the main program is IntMax.hsc, the Main-Is line points to IntMax.hs. When Cabal looks for IntMax.hs but finds IntMax.hsc, it automatically feeds the latter through hsc2hs as part of the build.

$ cabal configure
Resolving dependencies...
Configuring intmax-0.0...

$ cabal build
Prerocessing executables for intmax-0.0...
Building intmax-0.0...
[1 of 1] Compiling Main             ( dist\build\intmax\intmax-tmp\IntMax.hs, dist\build\intmax\intmax-tmp\Main.o )
Linking dist\build\intmax\intmax.exe ...

$ ./dist/build/intmax/intmax
2147483647

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

flags = #const FORMAT_MESSAGE_FROM_SYSTEM
        .|.
        #const FORMAT_MESSAGE_IGNORE_INSERTS

Putting them all on one line will result in syntax errors.

心头的小情儿 2024-07-31 13:04:33

GHC 正在尽可能地从 -fvia-c 转向 -fasm

一个副作用是,即使在 -fvia-c 模式下,您的程序也可能在不使用任何 C 头文件的情况下进行编译,以确保编译结果在功能上与 中的 GHC 相同-fasm 模式。

因此,有必要使用 hsc2hsc2hs 或在 GHC 编译源代码之前运行的其他预处理器。

c2hs 本身支持 enum 常量...已经有一段时间了,但我认为这样的事情是正确的。

#c
enum Foo = { Bar, Baz };
void something(enum Foo foo) {}
#endc

{#enum Foo#}

somethingBar = {#call pure something#} (cFromEnum Bar)

#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 supports enum constants... it's been a while, but I think something like this is right.

#c
enum Foo = { Bar, Baz };
void something(enum Foo foo) {}
#endc

{#enum Foo#}

somethingBar = {#call pure something#} (cFromEnum Bar)

#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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文