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

Disable or enable code by 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 语句?

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

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

if debug then
  printf ...;

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

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

let debug = ref false

...

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