Dans un programme Haskell, quelle est la meilleure façon d'utiliser les constantes définies dans les en-têtes C?Haskell: Comment obtenir les valeurs de # define-d constantes?
Répondre
Pour cette tâche, hsc2hs est votre ami. Pour un exemple simple, prenons la valeur INT_MAX
de limits.h
.
$ cat >IntMax.hsc
module Main where
#include <limits.h>
c_INT_MAX = #const INT_MAX
main = print c_INT_MAX
Avec hsc2hs, nous pouvons #include
les en-têtes et d'utiliser les valeurs des constantes de la directive #const
.
au lieu de construire à la main, utilisez 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
Notez que même si le nom du programme principal est IntMax.hsc
, les points de ligne Main-Is
à IntMax.hs
. Lorsque Cabal cherche IntMax.hs
mais trouve IntMax.hsc
, il alimente automatiquement ce dernier via hsc2hs dans le cadre de la construction.
$ 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
Notez que vous aurez envie de briser les lignes avec plusieurs constantes. Supposons que vous assemblez un champ de bits pour passer à FormatMessage. Vous aurez besoin de l'écrire comme
flags = #const FORMAT_MESSAGE_FROM_SYSTEM
.|.
#const FORMAT_MESSAGE_IGNORE_INSERTS
Si vous les mettez tous sur une ligne, cela entraînera des erreurs de syntaxe.
GHC s'éloigne de -fvia-c
et vers -fasm
autant que possible. Un effet secondaire est que votre programme peut être compilé sans utiliser d'en-têtes C, même en mode -fvia-c
, afin de garantir que les résultats de compilation sont fonctionnellement identiques à GHC en mode -fasm
.
Il est donc nécessaire d'utiliser hsc2hs
, c2hs
, ou d'autres préprocesseurs exécuter avant GHC compile les sources.
c2hs
supporte nativement enum
constantes ... ça fait longtemps, mais je pense que quelque chose comme ça est juste.
#c
enum Foo = { Bar, Baz };
void something(enum Foo foo) {}
#endc
{#enum Foo#}
somethingBar = {#call pure something#} (cFromEnum Bar)
#define
« constantes d sont une tique plus délicate. Je les ai toujours simplement copiés en ligne, ou utilisé des C supplémentaires pour les transformer en enums ou const variables.
- 1. valeurs constantes dans Rails
- 2. Comment obtenir toutes les constantes de shader (uniformes) d'un ID3DXEffect?
- 3. Comment obtenir et enregistrer des constantes?
- 4. Comment obtenir une liste de constantes dans une classe et leurs valeurs
- 5. Obtenir toutes les valeurs d'énumération
- 6. D'où viennent ces valeurs dans cette fonction de haskell?
- 7. Obtenir les valeurs d'énumération de la classe
- 8. Obtenir toutes les valeurs de NSDictionary (profondément)
- 9. C# Technique - Obtention de valeurs constantes par chaîne
- 10. Comment obtenir des valeurs par les opérations de chaînes Perl?
- 11. comment obtenir les multiples valeurs d'une boîte de sélection?
- 12. Comment les valeurs constantes affectent-elles la clause ON des jointures?
- 13. Comment utiliser les FFI de Haskell sur les structures?
- 14. Constantes dans les cartographies de bulldozer
- 15. obtenir les noms et les valeurs d'un poste de formulaire
- 16. Haskell Conditionals
- 17. Les constantes de chaîne sont-elles surestimées?
- 18. NSXMLParser et les constantes d'erreur
- 19. C# (ASP.Net) Lier les valeurs de sélection à des constantes dans Codebehind
- 20. Accéder aux valeurs constantes d'un modèle Apache Velocity?
- 21. Comment définir les constantes de classe-portée dans ruby?
- 22. Comment éviter de redéclater accidentellement les constantes globales en C++?
- 23. Comment obtenir les valeurs des contrôles dans ModalPopupExtender?
- 24. Comment obtenir les valeurs d'un ENUM dans un SelectList
- 25. Comment obtenir toutes les valeurs Enum dans XMLBeans?
- 26. Pour obtenir les valeurs de décalage à partir de jquery
- 27. Comment organiser les fichiers dans les programmes Haskell?
- 28. elemIndices à Haskell
- 29. Partage de constantes sur un service WCF
- 30. Afficher les étapes de réduction dans Haskell