我看到这经常用于使模块与GHC和Hugs兼容,但谷歌并没有帮助我更多地了解它。
我可以在条件中加入什么?我可以根据正在使用的“基础”版本来制作模块的一部分吗?
编辑3/2017 :这是一个很好的资源:https://guide.aelve.com/haskell/cpp-vww0qd72
答案 0 :(得分:36)
GHC文档有一个section relating to the C pre-processor,它记录了一些预定义的文档 预处理器宏。
Cabal文档中有section relating to conditional compilation,其中提供了与base
相关的示例。如果您正在编写便携包,那么无论如何都应该使用Cabal。
答案 1 :(得分:23)
除了GHC(OS,架构等)定义的非常有用的标志之外,当使用cabal时,还定义了其他标志和宏。
检查包版本
以下是来自crypto-api的用法,用于检查所使用的tagged
包的版本:
#if MIN_VERSION_tagged(0,2,0)
import Data.Proxy
#endif
自定义CPP基于Cabal标志定义
您可以根据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用户指南。 This page包含您可能正在寻找的“条件编译”信息。
答案 2 :(得分:6)
#ifdef
和朋友被C preprocessor(CPP)使用。它们提供了一种有条件地编译代码的方法。您可以通过在文件顶部添加编译语{-# LANGUAGE CPP #-}
来启用CPP。
许多处理Haskell代码的程序为预处理器设置了一些宏(例如,GHC将__GLASGOW_HASKELL__
设置为GHC的版本),因此可以有条件地编译代码,例如为Hugs使用不同的专用库。 GHC。
答案 3 :(得分:2)
如果使用-cpp
选项运行Haskell编译器,它将首先使用CPP(C预处理器)预处理源文件。
看一下4.11.3节。影响C预处理器的选项here。