在Haskell程序中,使用C头文件中定义的常量的最佳方法是什么?Haskell:我如何获得#define-d常量的值?
2
A
回答
6
对于这项任务,hsc2hs是你的朋友。
举一个简单的例子,让我们从limits.h
得到INT_MAX
的值。
$ cat >IntMax.hsc
module Main where
#include <limits.h>
c_INT_MAX = #const INT_MAX
main = print c_INT_MAX
随着hsc2hs,我们可以#include
头,并与#const
指令使用常量的值。
代替手工打造,使用惊天动地:
$ 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.hsc
,该Main-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
将它们全部放在一行上将导致语法错误。
4
尽可能GHC正从-fvia-c
转向-fasm
。
一个副作用是,即使在-fvia-c
模式下,您的程序也可以根本不使用任何C头进行编译,以确保编译结果在功能上等于-fasm
模式下的GHC。
因此有必要使用hsc2hs
,c2hs
或其他预处理器在之前运行GHC编译源代码。
c2hs
原生支持enum
常量...这已经有一段时间了,但我认为这样的事情是正确的。
#c
enum Foo = { Bar, Baz };
void something(enum Foo foo) {}
#endc
{#enum Foo#}
somethingBar = {#call pure something#} (cFromEnum Bar)
#define
'd常数是一个更复杂的技巧。我总是直接复制它们,或者使用附加的C转换成枚举或const变量。
相关问题
- 1. 如何在GDB中打印#defined常量?
- 2. equationsToMatrix:我如何获得变量的值?
- 3. 如何在文件中获得常量名称和常量值
- 4. 'Undeclared Identifier'error with defined常量
- 5. 如何获得量化值
- 6. 如何获得VK常量的键名?
- 7. 我如何获得批量
- 8. 如何获得decimal.Inexact异常的值?
- 9. 我如何获得价值?
- 10. 我如何获得selectedRange.location值?
- 11. 如何获得常量表达式的值
- 12. 如何获得一个类中的常量列表及其值
- 13. 如何获得我的DAX度量值以计算分组值?
- 14. 如何获得jQuery的变量的值
- 15. 如何从Excel VBA中获得常量?
- 16. 按名称获得常量值
- 17. 如何获得更多的变量值?
- 18. 如何获得%vsspv_visualstudio_dir%变量的值?
- 19. 如何获得块内变量的值
- 20. 如何获得redis hash值的数量?
- 21. 如何获得变量的值?
- 22. 如何获得posts_per_page的价值变量
- 23. 如何获得Tensorflow 4D张量的值
- 24. VBA如何获得单元值作为模块级别常量?
- 25. 我如何获得表变量的rowcount?
- 26. 我如何获得的卡片序列在Haskell
- 27. 我如何获得SpecFlow预期异常?
- 28. 我如何获得Liberator异常信息?
- 29. R - 如何获得一个变量的值作为常量处理?
- 30. PHP:我如何获得$ _GET变量的中间值?