我在哪里可以了解#ifdef?

时间:2011-06-15 17:37:41

标签: haskell ghc c-preprocessor

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

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

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

4 个答案:

答案 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