You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:15:05