Haskell中的CPP扩展和多行文字

sas*_*nin 11 preprocessor haskell conditional-compilation ghc

是否可以在包含多行字符串文字的Haskell代码上使用CPP扩展?Haskell还有其他条件编译技术吗?

例如,我们来看看这段代码:

-- If the next line is uncommented, the program does not compile.
-- {-# LANGUAGE CPP #-}

msg = "Hello\
  \ Wor\
  \ld!"

main = putStrLn msg
Run Code Online (Sandbox Code Playgroud)

如果我取消注释{-# LANGUAGE CPP #-},那么GHC会用一个词法错误来反驳这段代码:

[1 of 1] Compiling Main             ( cpp-multiline.hs, cpp-multiline.o )

cpp-multiline.hs:4:17:
    lexical error in string/character literal at character 'o'
Run Code Online (Sandbox Code Playgroud)

使用GHC 6.12.1,可以使用cpphs.

我确认使用cpphs.compat包装器和-pgmP cpphs.compat选项有帮助,但我希望有一个不依赖于自定义shell脚本的解决方案.-pgmP cpphs不起作用.

PS我需要为GHC <6.12和GHC> = 6.12使用不同的代码,是否可以不使用预处理器?

UPD.除了接受Ganesh的答案之外,我还发现另一个解决方法是将所有条件声明放在一个单独的模块中{-# LANGUAGE CPP #-},从而避免使用多行字符串的模块中的CPP.

GS *_*ica 6

cpphs现在有一个--cpp选项本身,我认为不需要compat脚本:请参阅http://haskell.org/cpphs/上的cpphs 1.3条目

我认为您需要传递-optP --cpp给GHC(以及-pgmP cpphs)以启用此行为.