2

调试 gen_server 模块时,我想记录更多详细信息状态。

init()->
    put(?COMPLETED_COMMANDS,[]),
-ifdef(DEBUG).
    put(?DETAIL_STATUS,[]),
-endif.
    ok.

编译器给出以下错误。

src/benvolio_command_cache.erl:34: syntax error before: ','
src/benvolio_command_cache.erl:36: syntax error before: '.'
src/benvolio_command_cache.erl:33: variable 'DEBUG' is unbound
src/benvolio_command_cache.erl:33: function ifdef/1 undefined

如何在*.erl文件的函数中添加调试代码行?

4

2 回答 2

5

宏指令不能在函数内部使用。请参阅8.5 宏中的流控制

于 2013-01-22T07:25:29.400 回答
0

根据Erlang 参考手册用户指南(11.1 版)(2020 年 9 月 22 日)中的9. Preprocessor章节,

  • 不能在函数中定义;尽管在9.2 定义和使用宏中间接说明了这一点:

    宏定义可以放在模块的属性和函数声明中的任何位置,但定义必须在宏的任何使用之前。

  • 宏指令不能在函数内部使用(参见9.5 宏中的流控制


至于您要实现的目标,9.5 Flow Control in Macros中有一个示例可以回答您的问题:

例子:

-module(m).
...

-ifdef(debug).
-define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
-else.
-define(LOG(X), true).
-endif.

...

当需要跟踪输出时,要在编译debug模块时定义 :m

% erlc -Ddebug m.erl

或者

1> c(m, {d, debug}).
{ok,m}

?LOG(Arg)然后扩展为调用io:format/2并为用户提供一些简单的跟踪输出。

更重要的是,当模块在没有debug宏的情况下编译时,?LOG(Arg)将扩展为true.


请参阅、 和的编译选项以及.compile:file/2c/\[2,3\]erlc

于 2020-09-28T14:40:22.747 回答