2010-10-06 44 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.