簡體   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