FFI в Haskell, вопрос о LANGUAGE CPP и о том, как использовать c-структуру с FFI

StackOverflow https://stackoverflow.com/questions/5889096

  •  28-10-2019
  •  | 
  •  

Вопрос

У меня есть несколько вопросов о FFI в Haskell

  1. Я знаю, что должен использовать язык pragma {-# LANGUAGE ForeignFunctionInterface #-}, но какая разница, когда я использую {-# LANGUAGE CPP, ForeignFunctionInterface #-}, что я могу сделать "больше" с CPP
  2. Я использую функцию в c, которая использует код struct, как я могу справиться с этим в FFI?
  3. когда мне нужно использовать CInt, а когда просто Int?
Это было полезно?

Решение

  1. Если вы включите расширение языка CPP, вы сможете легально включить синтаксис препроцессора C в свою программу Haskell.
  2. Получить доступ к структуре немного сложнее. Самый простой способ - это, вероятно, использовать класс типов Storable для определения методов peek и poke для каждого поля структуры. Вам может помочь инструмент hsc2hs .
  3. Вы используете CInt всякий раз, когда вам нужно передать код Int Haskell на C или от C, так как это обеспечит выполнение любого необходимого маршалинга (то же самое касается CDouble, CString и т. д.).

В пакете X11 есть множество примеров определения и упорядочивания структур через FFI.


Дополнительная информация:

Другие советы

  1. CPP - это препроцессор C.Это позволяет использовать условную компиляцию и макросы.Обычно в этом нет необходимости, но это становится полезным, как только у вас есть платформо-зависимый код, где код для компиляции определяется внешним сценарием (например, с автоинструментами).
  2. Взгляните на c2hs
  3. Используйте генерирующий кодовый код только для прямого импорта.При написании высокоуровневой привязки переключитесь на Cint, поскольку он не требует от пользователя импорта необходимых библиотек и является стандартом Haskell.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top