FFI в Haskell, вопрос о LANGUAGE CPP и о том, как использовать c-структуру с FFI
Вопрос
У меня есть несколько вопросов о FFI в Haskell
- Я знаю, что должен использовать язык pragma
{-# LANGUAGE ForeignFunctionInterface #-}
, но какая разница, когда я использую{-# LANGUAGE CPP, ForeignFunctionInterface #-}
, что я могу сделать "больше" с CPP - Я использую функцию в c, которая использует код
struct
, как я могу справиться с этим в FFI? - когда мне нужно использовать
CInt
, а когда простоInt
?
Решение
- Если вы включите расширение языка
CPP
, вы сможете легально включить синтаксис препроцессора C в свою программу Haskell. - Получить доступ к структуре немного сложнее. Самый простой способ - это, вероятно, использовать класс типов
Storable
для определения методовpeek
иpoke
для каждого поля структуры. Вам может помочь инструмент hsc2hs . - Вы используете
CInt
всякий раз, когда вам нужно передать кодInt
Haskell на C или от C, так как это обеспечит выполнение любого необходимого маршалинга (то же самое касаетсяCDouble
,CString
и т. д.).
В пакете X11 есть множество примеров определения и упорядочивания структур через FFI.
Дополнительная информация:
Другие советы
-
CPP
- это препроцессор C.Это позволяет использовать условную компиляцию и макросы.Обычно в этом нет необходимости, но это становится полезным, как только у вас есть платформо-зависимый код, где код для компиляции определяется внешним сценарием (например, с автоинструментами). - Взгляните на c2hs
- Используйте генерирующий кодовый код только для прямого импорта.При написании высокоуровневой привязки переключитесь на
Cint
, поскольку он не требует от пользователя импорта необходимых библиотек и является стандартом Haskell.
Не связан с StackOverflow