HASKELL : #define-d 상수의 값을 어떻게 얻습니까?
문제
Haskell 프로그램에서 C 헤더에 정의 된 상수를 사용하는 가장 좋은 방법은 무엇입니까?
해결책
이 작업을 위해 HSC2HS 당신의 친구입니다.
간단한 예를 위해 INT_MAX
~에서 limits.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.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
여러 상수가있는 선을 분해하고 싶을 것입니다. 비트 필드를 조립하고 있다고 가정 해 봅시다 형식 관리. 당신은 그것을 다음과 같이 쓰고 싶을 것입니다
flags = #const FORMAT_MESSAGE_FROM_SYSTEM
.|.
#const FORMAT_MESSAGE_IGNORE_INSERTS
한 줄에 모두 넣으면 구문 오류가 발생합니다.
다른 팁
GHC가 멀어지고 있습니다 -fvia-c
그리고 향해 -fasm
가능한 한.
한 가지 부작용은 귀하의 프로그램이 C 헤더를 사용하지 않고도 컴파일 될 수 있다는 것입니다. -fvia-c
모드, 컴파일 결과가 GHC와 기능적으로 동일하도록하기 위해 -fasm
방법.
따라서 사용해야합니다 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 변수로 변환했습니다.