2010-10-06 41 views
1

對於我的日誌記錄,我希望能夠在編譯時宏觀語句,所以 - 定義爲救援!不同秩序的Erlang宏

對於我的編譯器標誌我正在編譯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. 
+1

不,沒辦法測試宏定義。 – rvirding 2010-10-06 23:19:21

回答

5

我最好寫一個更全面的答覆。

不,沒有辦法測試實際的宏定義,只能測試是否定義了具有該名稱的宏。而且,您只能測試宏名稱,而不能測試具有不同元素的其他宏定義。這是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.