HaskellHaskell中的条件编译
Posted 编程fan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HaskellHaskell中的条件编译相关的知识,希望对你有一定的参考价值。
背景
由于目前在Haskell中还没有好用的方法获取语言环境(glib中提供了g_get_language_names
函数实际上可以达到目的,但比较难用),所以需要调用平台相关的函数,在Windows下使用GetSystemDefaultLangID
。这需要根据不同的操作系统执行的不一样的代码,即根据不同的平台编译不同部分的代码,即条件编译。
Haskell中的条件编译支持
比较令人失望的是,在条件编译这块,Haskell并没有自己出彩的地方,继续沿用了C/C++那一套,即使用预处理指令判断预定义的宏达到编译不同部分代码的目的。在语法上,Haskell的预编译指令跟C/C++的完全一样,所以有了C/C++的经验可以无缝迁移到Haskell上面。
下面是一些使用上的细节点:
Q1:怎么启用Haskell程序的预处理过程
我们知道,正常的Haskell程序处理过程是没有预处理的,我们需要一种方式明确告知构造过程要调用预处理器。这是通过CPP语言扩展实现的,这需要我们在源文件的顶层添加:
{-# LANGUAGE CPP #-}
Q2:Haskell提供了哪些标准宏
在GHC(8.2.2)用户手册7.11.3.1. Standard CPP macros列了一些可用的宏可以用于代码,包括GHC软件版本、操作系统、硬件架构、软件包等方面的宏,下面仅摘录两个:
os_HOST_OS=1
This define allows conditional compilation based on the Operating System, where⟨os⟩ is the name of the current Operating System (eg.
linux
,mingw32
for Windows,solaris
, etc.).arch_HOST_ARCH=1
This define allows conditional compilation based on the host architecture, where⟨arch⟩ is the name of the current architecture (eg.
i386
,x86_64
,powerpc
,sparc
, etc.).
除了这些预定义宏,你也可以在代码里像使用 C/C++ 一样,定义自己的宏。
Q3:怎将通过命令参数定义宏
-D
选项,这跟gcc编译器的用法完全一致,可以在编译时通过定义不同的宏控制编译过程。
示例
{-# LANGUAGE CPP #-}
main :: IO ()
main =
#if defined linux_HOST_OS
putStrLn "Linux"
#elif defined mingw32_HOST_OS
putStrLn "Windows"
#else
putStrLn "Other"
#endif
mingw32_HOST_OS
代表全部
Windows
系统,不要被其中的
32
迷惑,以为仅代表是
32
位
Windows
系统。
以上是关于HaskellHaskell中的条件编译的主要内容,如果未能解决你的问题,请参考以下文章