The Preprocessor

?MODULE, ?MODULE_STRING, ?FILE, ?LINE, ?FUNCTION_NAME, ?FUNCTION_ARITY, ?MACHINE, ?OTP_RELEASE, ?FEATURE_AVAILABLE(F), ?FEATURE_ENABLED(F).

18.1 Macros

-define(TIMEOUT, 5000).
-define(SQUARE(X), ((X) * (X))).
-define(LOG(Msg, Args), io:format("[~p:~p] " ++ Msg ++ "~n", [?MODULE, ?LINE | Args])).

f() -> receive after ?TIMEOUT -> ?LOG("~p", [?SQUARE(4)]) end.

18.2 Predefined macros

?MODULE, ?MODULE_STRING, ?FILE, ?LINE, ?FUNCTION_NAME, ?FUNCTION_ARITY, ?MACHINE, ?OTP_RELEASE, ?FEATURE_AVAILABLE(F), ?FEATURE_ENABLED(F).

18.3 Conditional compilation

Define from the command line: erlc -DDEBUG mod.erl or {erl_opts, [{d, 'DEBUG'}]} in rebar.config.

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.

-ifndef(DEBUG).
-define(DBG(X), ok).
-else.
-define(DBG(X), io:format("~p~n", [X])).
-endif.

-if(?OTP_RELEASE >= 27).
-define(HAS_JSON, true).
-endif.

18.4 Includes

-include("records.hrl").                       % relative path / include dirs
-include_lib("kernel/include/logger.hrl").     % from an application

18.5 Stringify

-define(SHOW(Expr), io:format("~s = ~p~n", [??Expr, Expr])).
?SHOW(1 + 2).     % prints: 1 + 2 = 3

18.6 Parse transforms

Compile-time AST transformations: -compile({parse_transform, my_transform}). (e.g., ms_transform for ets:fun2ms/1, lager_transform). Use sparingly.