【发布时间】:2014-10-22 15:48:36
【问题描述】:
我需要让我的程序的一些小块在不同平台上表现不同。 GHC好像不太擅长交叉编译,所以打算在Linux和Windows上编译相同的代码。
推荐的方法是什么?我是否必须编写一个模块的多个版本,或者我可以将预处理指令之类的东西放入我的代码中以有条件地编译一个或另一个代码块?
附注我正在使用 GHC 和 Cabal 进行管理。
【问题讨论】:
我需要让我的程序的一些小块在不同平台上表现不同。 GHC好像不太擅长交叉编译,所以打算在Linux和Windows上编译相同的代码。
推荐的方法是什么?我是否必须编写一个模块的多个版本,或者我可以将预处理指令之类的东西放入我的代码中以有条件地编译一个或另一个代码块?
附注我正在使用 GHC 和 Cabal 进行管理。
【问题讨论】:
GHC 支持running your code through a C preprocessor。这不是一个非常 Haskelly 的解决方案,但它是在必要时在实践中使用的解决方案。
编辑:Zeta 指出有一个针对每个文件的语言选项(我真的知道,但上面的链接中没有提到):
{-# LANGUAGE CPP #-}
对于阴谋集团,您可以use the extensions field。引用一下,因为它提到了这个用例:
扩展:标识符列表
每个模块使用的 Haskell 扩展列表。扩展名是扩展类型的构造函数。这些决定了相应的编译器选项。特别是,CPP 指定 Haskell 源文件将使用 C 预处理器进行预处理。
可以通过在受影响的源文件中放置 LANGUAGE pragma 来指定仅由一个模块使用的扩展,例如: {-# LANGUAGE CPP,MultiParamTypeClasses #-}
【讨论】:
-cpp,但在每个文件的基础上 {-# LANGUAGE CPP #-} 不是首选吗?