通过预处理器禁用或启用代码

时间:2015-11-24 17:40:15

标签: ocaml preprocessor

在C ++中,我写了

bool positive (int a)
{
#ifdef DEBUG
    cout << "Checking the number " << a << "\n";
#endif
    return a > 0;
}

在OCaml我可以写

let positive x = 
    begin
        printf "Checking the number %d\n" x;
        x > 0
    end 

但是如何在不处于调试模式时禁用printf语句?

2 个答案:

答案 0 :(得分:4)

如果没有预处理,您只需将全局标志定义为let debug = true并写入:

if debug then
  printf ...;

如果debug为false,则ocamlopt将删除此代码。也就是说,它很麻烦,只应在生产代码的性能至关重要的情况下使用。

另一个不太优化的选项是拥有一个可变标志。这样更方便,因为您不必重建程序来激活或停用调试日志记录。您可以使用命令行选项来控制它(请参阅Arg模块的文档)。

let debug = ref false

...

if !debug (* i.e. debug's value is true *) then
  printf ...;

答案 1 :(得分:3)

你可以使用cppo:https://github.com/mjambon/cppo。 这可以通过opam获得,并提供C类预处理器功能。