【问题标题】:Erlang macros with different arity具有不同arity的Erlang宏
【发布时间】:2010-10-06 23:05:34
【问题描述】:

对于我的日志记录,我希望能够在编译时宏化语句,所以 -define 来救援!

对于我使用 erlc -DFOO 编译的编译器标志,-ifdef 是否可以确定 FOO = ok、FOO/0 和 FOO/1 之间的差异?

-module(foo).

-define(FOO, ok).
-define(FOO(X), io:format("~p~n", [X])).

-export([test_x/1]).

%% i want this to be true iff FOO = ok, not if ?FOO/1 exists
-ifdef(FOO).
test_x(X) ->
    ?FOO(":) " ++ X).
-else.
test_x(X) ->
    ?FOO(":( " ++ X).
-endif.

【问题讨论】:

  • 不行,没办法测试宏定义。

标签: erlang preprocessor


【解决方案1】:

我最好写一个更全面的回复。

不,无法测试实际的宏定义,您只能测试是否已定义具有该名称的宏。而且您只能测试宏名称,而不是具有不同参数的替代宏定义。这是过去的遗留物,在 R13B 之前,每个名称只能有一个宏定义。新的更接近于模仿模块中的功能。

执行此操作的“标准”方式是使用一些标志宏来确定要使用的宏/函数集。例如:

-ifdef(DEBUG).

-define(DEBUG_PRINT(X), <... something long here ...>).
foo(X) -> <... debuggy stuff here ...>.

-else

-define(DEBUG_PRINT(X), ok).
foo(X) -> <... normal stuff here ...>.

-endif.

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2015-05-15
    • 2014-02-14
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2016-04-21
    • 2017-09-12
    • 2016-05-05
    相关资源
    最近更新 更多