Где я могу узнать о #ifdef? - PullRequest
34 голосов
/ 15 июня 2011

Я часто вижу, что это делает модули совместимыми с GHC и Hugs, но Google не помогает мне узнать больше об этом.

Что я могу положить внутрь условного?Могу ли я сделать части модуля зависящими от того, какая версия «base» используется?

РЕДАКТИРОВАТЬ 3/2017 : Это отличный ресурс: https://guide.aelve.com/haskell/cpp-vww0qd72

Ответы [ 4 ]

36 голосов
/ 15 июня 2011

В документации GHC есть раздел , относящийся к препроцессору C , в котором документированы некоторые предопределенные макросы препроцессора.

В документации Cabal есть раздел , относящийся кусловная компиляция , которая приводит пример, относящийся к base.Если вы пишете переносимый пакет, вы все равно должны использовать Cabal.

23 голосов
/ 15 июня 2011

Помимо очень полезных флагов, определенных GHC (ОС, архитектура и т. Д.), При использовании cabal определяются другие флаги и макросы.

Проверка версий пакета

Вот пример использования crypto-api , который проверяет версию используемого пакета tagged:

#if MIN_VERSION_tagged(0,2,0)
import Data.Proxy
#endif

Пользовательские CPP определяются на основе флагов Cabal

Вы можете определять символы CPP в зависимости от флагов клики.Вот (излишне сложный) пример из pureMD5 (из файла .cabal):

 if arch(i386) || arch(x86_64)
   cpp-options: -DFastWordExtract

Внутри модуля .hs вы можете использовать #ifdef, например:

#ifdef FastWordExtract
getNthWord n b = inlinePerformIO (unsafeUseAsCString b (flip peekElemOff n . castPtr))
#else
... other code ...
#endif

Более подробную информацию вы можете найти в руководстве пользователя Cabal. Эта страница содержит информацию об условной компиляции, которую вы, вероятно, ищете.

6 голосов
/ 15 июня 2011

#ifdef и друзья используются препроцессором C (CPP).Они предоставляют возможность компилировать код условно.Вы можете включить использование CPP, добавив прагму {-# LANGUAGE CPP #-} поверх файла.

Многие программы, работающие с кодом на Haskell, устанавливают некоторые макросы для препроцессора (например, GHC устанавливает __GLASGOW_HASKELL__ дляверсия GHC), поэтому можно условно скомпилировать код, например, для использования различных подходящих библиотек для Hugs и GHC.

2 голосов
/ 15 июня 2011

Если вы запустите ваш компилятор Haskell с опцией -cpp, он сначала обработает исходные файлы с помощью CPP (C Pre Processor).

Посмотрите раздел 4.11.3.Опции, влияющие на препроцессор C здесь .

...