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.プリプロセッサの章によると、

  • マクロは関数で定義できません。9.2マクロの定義と使用で間接的に述べられていますが:

    マクロ定義は、モジュールの属性と関数宣言の間のどこにでも配置できますが、マクロを使用する前に定義を行う必要があります。

  • マクロディレクティブは関数内では使用できません( 9.5マクロのフロー制御を参照) 。


あなたが達成しようとしていることに関しては、あなたの質問に答えるマクロの9.5フロー制御の例があります:

例:

-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 に答える