具有不同算术性的Erlang宏

具有不同算术性的Erlang宏,erlang,preprocessor,Erlang,Preprocessor,对于我的日志记录,我希望能够在编译时对语句进行宏输出,因此,请重新定义 对于我用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 exis

对于我的日志记录,我希望能够在编译时对语句进行宏输出,因此,请重新定义

对于我用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.

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

不,无法测试实际宏定义,只能测试是否定义了具有该名称的宏。您只能对宏名称进行测试,而不能对具有不同算术数的可选宏定义进行测试。这是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.
-ifdef(调试)。
-定义(调试打印(X),)。
foo(X)->。
-否则
-定义(调试打印(X),确定)。
foo(X)->。
-恩迪夫。

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

不,无法测试实际宏定义,只能测试是否定义了具有该名称的宏。您只能对宏名称进行测试,而不能对具有不同算术数的可选宏定义进行测试。这是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.
-ifdef(调试)。
-定义(调试打印(X),)。
foo(X)->。
-否则
-定义(调试打印(X),确定)。
foo(X)->。
-恩迪夫。

否,无法测试宏定义。否,无法测试宏定义。