Wie können Sie in einem Haskell-Programm die in C-Headern definierten Konstanten am besten verwenden?Haskell: Wie bekomme ich die Werte von # define-d Konstanten?
Antwort
Für diese Aufgabe ist hsc2hs Ihr Freund. Für ein einfaches Beispiel erhalten wir den Wert INT_MAX
von limits.h
.
$ cat >IntMax.hsc
module Main where
#include <limits.h>
c_INT_MAX = #const INT_MAX
main = print c_INT_MAX
Mit hsc2hs, können wir #include
Header und die Werte der Konstanten mit der #const
Direktive verwenden.
Statt Gebäude von Hand verwenden 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
Beachten Sie, dass, auch wenn der Name des Hauptprogramms ist IntMax.hsc
, die Main-Is
Linie zeigt auf IntMax.hs
. Wenn Cabal nach IntMax.hs
sucht, aber IntMax.hsc
findet, füttert es automatisch letzteres durch hsc2hs als Teil des Builds.
$ 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
Beachten Sie, dass Sie Zeilen mit mehreren Konstanten aufteilen möchten. Angenommen, Sie bauen ein Bitfeld zusammen, um es an FormatMessage zu übergeben. Sie werden es als
flags = #const FORMAT_MESSAGE_FROM_SYSTEM
.|.
#const FORMAT_MESSAGE_IGNORE_INSERTS
schreiben wollen sie alle auf einer Linie Putting wird in Syntaxfehler zur Folge haben.
GHC entfernt sich von -fvia-c
und in Richtung -fasm
, wo immer dies möglich ist.
Ein Nebeneffekt ist, dass Ihr Programm ohne Verwendung von C-Header überhaupt kompiliert werden kann, auch im -fvia-c
Modus, um sicherzustellen, dass die Kompilierungsergebnisse identisch mit GHC in -fasm
Modus sind.
So ist es notwendig, hsc2hs
, c2hs
oder andere Präprozessoren zu verwenden laufen vor GHC Quellen kompiliert.
c2hs
nativ unterstützt enum
Konstanten ... es ist eine Weile her, aber ich denke, so etwas ist richtig.
#c
enum Foo = { Bar, Baz };
void something(enum Foo foo) {}
#endc
{#enum Foo#}
somethingBar = {#call pure something#} (cFromEnum Bar)
#define
'd Konstanten sind ein Tick Tricker. Ich habe sie immer nur inline kopiert oder zusätzliche C verwendet, um sie dann in enums oder const-Variablen umzuwandeln.
- 1. Wie bekomme ich die Werte von AJAX
- 2. AS3 - Wie bekomme ich ein Array von Konstanten einer Klasse?
- 3. Wie bekomme ich die Werte [] in PHP?
- 4. Wie bekomme ich alle Shader-Konstanten (Uniformen) von einem ID3DXEffect?
- 5. Gradle - Wie bekomme ich Werte von AndroidManifest?
- 6. Wie bekomme ich Werte von zwei Tabellen?
- 7. Wie bekomme ich einen Zeigerwert in Haskell?
- 8. Wie bekomme ich Werte von JQuery - IonRangeSlider?
- 9. Haskell Pattern-Matching - wie Konstanten verwenden variable
- 10. Wie bekomme ich die Werte von span-Tags
- 11. Wie bekomme ich die Werte von einem $ .ajax mit PHP
- 12. AngularJS: Konstanten gegen Werte
- 13. Bietet Haskell Min/Max-Konstanten für den Bereich von Int?
- 14. Wie bekomme ich Daten von HTTPS-Antworten mit Haskell?
- 15. #if defined WINDOWS vs #if defined (WINDOWS)
- 16. Wie bekomme ich Werte von Array erstellt von toArray
- 17. Wie bekomme ich POST-Werte in Perl
- 18. Wie bekomme ich die Werte der im ColorDialog verwendeten Grundfarben?
- 19. Wie bekomme ich eine Liste aller Konstanten, die man von der Rails-Konsole bekommen kann
- 20. Wie bekomme ich Werte vom Service zurück?
- 21. Ruby hat keine konstanten Werte?
- 22. Wie bekomme ich eindeutige Werte in SQL?
- 23. Wie bekomme ich Registry-Werte mit Java?
- 24. Wie bekomme ich die Multi-Werte Multi-Felder
- 25. Wie bekomme ich die Werte von Postman Erweiterung "Form-Daten" -Werte
- 26. Wie bekomme ich die Werte von mehreren Kontrollkästchen und sende Werte an den Server in Android
- 27. Wie bekomme ich Null MySQL-Timestamp-Werte
- 28. Wie bekomme ich die Byte-Werte eines Strings in PHP?
- 29. Wie bekomme ich die URL ohne Querystring-Werte in asp.net?
- 30. Wie bekomme ich die Werte dynamisch in js