Haskell 中的 CPP 扩展和多行文字

问题描述 投票:0回答:3

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

例如,让我们看一下这段代码:

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

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

main = putStrLn msg

如果我取消注释

{-# 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'

使用 GHC 6.12.1,可以使用 cpphs。

我确认使用 cpphs.compat 包装器和

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

附注我需要对 GHC < 6.12 and GHC >= 6.12 使用不同的代码,没有预处理器可以吗?

UPD。除了 Ganesh 接受的答案之外,我还发现另一种解决方法是将所有条件声明放在带有

{-# LANGUAGE CPP #-}
的单独模块中,从而避免在具有多行字符串的模块中使用 CPP。

haskell preprocessor conditional-compilation ghc
3个回答
6
投票

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

我认为您需要将

-optP --cpp
传递给 GHC (以及
-pgmP cpphs
)才能启用此行为。


2
投票

GHC 用户手册似乎解决了这个问题:第 4.10.3.1 节读到

一个小警告:-cpp 对“字符串间隙”不友好。换句话说,像下面这样的字符串:

strmod = "\
\ p \
\ "

不要与-cpp一起使用; /usr/bin/cpp 省略反斜杠-换行符对。

但是,如果您在行尾添加空格,则 cpp(至少是 GNU cpp 以及可能的其他 cpp)会单独保留反斜杠-空格对,并且字符串间隙会按预期工作。


0
投票

决定是

strmod = "\
 p \
 "

反斜杠后不需要空格,行首也不需要反斜杠。

© www.soinside.com 2019 - 2024. All rights reserved.