繁体   English   中英

具有不同Arity的Erlang宏

[英]Erlang macros with different arity

对于我的日志记录,我希望能够在编译时对语句进行宏处理,因此-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.

我最好写一个更完整的答复。

不,无法测试实际的宏定义,您只能测试是否已定义了具有该名称的宏。 而且,您只能在宏名称上进行测试,而不能在具有不同Arities的替代宏定义上进行测试。 这是过去的遗迹,在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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM