如何定义和使用编译时宏?

时间:2015-07-31 13:42:30

标签: erlang

我试图了解有关编译的设置宏的更多信息。

Erlang compile documentation显示可以定义宏:

  

{d,Macro} {d,Macro,Value}

Defines a macro Macro to have the value Value. 
Macro is of type atom, and Value can be any term. 
The default Value is true.

我尝试使用指令设置宏:

-module(my_mod).    
-compile([debug_info, {d, debug_level, 1}]).
...

我如何在代码中使用此宏?例如,我试过这个:

my_func() ->
    if 
        debug_level == 1 -> io:format("Warning ...");
        true -> io:format("Error ...")
    end.

但是'错误......'总是输出。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

您可以使用-define

在代码中设置宏
-define(debug_level, 1).

如果您希望能够从编译命令行覆盖它,可以使用-ifndef包装它:

-ifndef(debug_level).
-define(debug_level, 1).
-endif.

这样,如果用

编译
erlc -Ddebug_level=2 file.erl
例如,

然后宏将具有值2而不是默认值1。

要访问宏的值,请在其前面添加?

my_func() ->
    if
        ?debug_level == 1 -> io:format("Warning ...");
        true -> io:format("Error ...")
    end.

请注意,由于?debug_level是一个常量,因此您将从if表达式中获取有关从不匹配的子句的编译器警告。