문제

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 변수로 변환했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top