具有不同数量的 Erlang 宏

发布于 2024-09-26 18:18:25 字数 421 浏览 2 评论 0原文

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

For my logging I wanted the ability to macro out the statements at compile time, so -define to the rescue!

For my compiler flags I'm compiling with erlc -DFOO, is there a way for -ifdef to determine the difference between FOO = ok, FOO/0, and 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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光是把杀猪刀 2024-10-03 18:18:25

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

不,没有办法测试实际的宏定义,您只能测试是否已经定义了具有该名称的宏。并且您只能测试宏名称,而不能测试具有不同参数的替代宏定义。这是 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.

I had better write a fuller reply.

No, there is no way to test the actual macro definition, you can only test if a macro with that name has been defined. And you can only test on the macro name, not on alternative macro definitions with different arities. This is relic from the past, before R13B, when you could only have one macro definition per name. The new one more closely mimics functions in a module.

The "standard" way of doing it is to use some flag macro to determine which set of macros/functions to use. For example:

-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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文