我在哪里可以了解#ifdef?

jbe*_*man 35 haskell ghc c-preprocessor

我看到这经常用于使模块与GHC和Hugs兼容,但谷歌并没有帮助我更多地了解它.

我可以在条件中加入什么?我可以根据正在使用的"基础"版本来制作模块的一部分吗?

编辑3/2017:这是一个很好的资源:https://guide.aelve.com/haskell/cpp-vww0qd72

Lam*_*eek 36

GHC文档有一个与C预处理器相关的部分,它记录了一些预定义的预处理器宏.

Cabal文档有一个与条件编译相关部分,给出了一个与之相关的示例base.如果您正在编写便携包,那么无论如何都应该使用Cabal.


Tho*_*son 23

除了由GHC(OS,体系结构等)定义的非常有用的标志之外,当使用cabal时,还定义了其他标志和宏.

检查包版本

以下是来自crypto-api的用法,用于检查tagged正在使用的软件包的版本:

#if MIN_VERSION_tagged(0,2,0)
import Data.Proxy
#endif
Run Code Online (Sandbox Code Playgroud)

自定义CPP基于Cabal标志定义

您可以根据cabal标志定义CPP符号.这是pureMD5(来自.cabal文件)的一个(不必要的复杂)示例:

 if arch(i386) || arch(x86_64)
   cpp-options: -DFastWordExtract
Run Code Online (Sandbox Code Playgroud)

.hs然后#ifdef,您可以使用模块内部,例如:

#ifdef FastWordExtract
getNthWord n b = inlinePerformIO (unsafeUseAsCString b (flip peekElemOff n . castPtr))
#else
... other code ...
#endif
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Cabal用户指南. 此页面包含您可能正在寻找的"条件编译"信息.


fuz*_*fuz 7

#ifdefC预处理器(CPP)使用和朋友.它们提供了一种有条件地编译代码的方法.您可以通过{-# LANGUAGE CPP #-}在文件顶部添加编译指示来启用CPP的使用.

许多处理Haskell代码的程序为预处理器设置了一些宏(例如GHC设置__GLASGOW_HASKELL__为GHC 的版本),因此可以有条件地编译代码,例如为Hugs和GHC使用不同的专用库.