Haskell 打开/关闭调试消息的编译器开关?
好的,这里有一个简单的问题。我已经编写了一个函数Haskell 打开/关闭调试消息的编译器开关?,haskell,ghc,Haskell,Ghc,好的,这里有一个简单的问题。我已经编写了一个函数debug::String->IO()。我想设置一下,当我以一种方式编译我的程序时,这个函数会写入标准错误,如果我以另一种方式编译我的程序,这个函数会变成no-op。有没有一些简单的编译时切换来做到这一点?或者我必须自己实现一些东西吗?我认为涉及跟踪不是解决这个问题的正确方法 相反,您可以使用预处理器来禁用/启用调试消息。将以下内容放在单独的文件中: {-# LANGUAGE CPP #-} import System.IO debug :: S
debug::String->IO()
。我想设置一下,当我以一种方式编译我的程序时,这个函数会写入标准错误,如果我以另一种方式编译我的程序,这个函数会变成no-op。有没有一些简单的编译时切换来做到这一点?或者我必须自己实现一些东西吗?我认为涉及跟踪
不是解决这个问题的正确方法
相反,您可以使用预处理器来禁用/启用调试消息。将以下内容放在单独的文件中:
{-# LANGUAGE CPP #-}
import System.IO
debug :: String -> IO ()
debug message =
#ifdef DEBUG
hPutStrLn stderr message
#else
return ()
#endif
{-#LANGUAGE CPP#-}
行启用当前文件的C预处理器。然后,您可以使用ghc-DDEBUG
或仅使用ghc
编译文件,并进行调试/不进行调试。您可以使用CPP预处理器和#ifdef
执行此操作
#ifdef
在函数的两个版本之间进行选择
{-# LANGUAGE CPP #-}
module Logging (debug) where
debug :: String -> IO ()
#ifdef DEBUG
debug = putStrLn
#else
debug _ = return ()
#endif
.cabal
文件中添加一个标志来控制它
...
flag debug
description: Enable debug logging
default: False
executable foo -- or library
if flag(debug)
cpp-options: -DDEBUG
...
-f
启用标志:
$ cabal configure -f debug
为了补充这里给出的优秀答案,我想提到这种方法,以防人们(如我)将最新版本的
stack
与hpack
一起使用
在package.yaml
文件中,我添加了以下内容:
flags:
debug: # Or whatever name you want to give to the flag
description: Enable debug
manual: True
default: False
when:
- condition: flag(debug)
cpp-options: -DDEBUG
然后,我建议将traceIO
from与结合使用,以便traceIO
在没有debug
标志的情况下编译代码时不会产生任何效果:
{-# LANGUAGE CPP #-}
-- ...
#ifdef DEBUG
import Debug.Trace
#else
import Debug.NoTrace
#endif
-- ...
someFunc :: IO ()
someFunc = do
-- ...
traceIO "Whatever..."
使用堆栈时,可以使用--flag
选项启用debug
标志:
stack build --flag "your-package:debug"
或者,如果您正在测试软件包:
stack build --flag "your-package:debug"
如果未使用hpack
,则可以按照以下说明配置阴谋集团文件:
. 您是否考虑过使用
Debug.Trace
?提供了一些不错的细节。@devnulltrace
不会做我想做的-但是traceIO
可能。。。