Haskell使用#ifdef CPP语言编译指示报错原因及正确使用方法
错误原因
你的#ifdef没有符合CPP预处理指令的语法要求:所有#开头的CPP预处理指令必须写在行首位置,前面不能有任何空格、制表符缩进。
你当前把#ifdef缩进放在do代码块内部,预处理阶段不会将其识别为合法的条件编译指令,而是会被当成普通Haskell代码交给编译器解析,自然会报#、ifdef、APP_DEBUG三个符号未定义的错误。
修复方法
直接把#ifdef和#endif两行顶格写即可,CPP预处理会先于Haskell语法解析执行,处理后的代码会自动符合do块的缩进要求:
{-# LANGUAGE CPP #-} main :: IO () main = do print "hello" #ifdef APP_DEBUG print "test" #endif
编译时如果要开启调试分支,需要给GHC传递宏定义参数:ghc -DAPP_DEBUG x.hs
如果不带-DAPP_DEBUG参数编译,print "test"这行会被自动移除,不会参与编译。
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

