宏允许在Erlang中使用结构缩写,然后Erlang预处理程序(EPP)在编译时会扩展它们。

定义一般形式:

% 无参
-define(Name, Replacement). 

% 有参数
-define(Name(Var1,Var2,...,VarN), Replacement).

example:

-define(FUNC,x).
-define(TION,+x).

double(x) -> ?FUNC?TION.

% 最后结果
double(x) -> x+x.

调试和宏

  • 宏有能力将宏的参数作为字符串保留,它由参数标记组成.可在变量前加前缀??来到目的,如:

      -define(F(Call),io:format("~p = ~p~n", [??Call,Call]).
      test1() -> ?F(length([1,2,3])).
      % test1() 结果为 "length ( [ 1 , 2 , 3 ] ) " = 3
    
  • 有一组常用的调试代码的预定义宏:

描述
?MODULE 扩展为它所在模块的名称
?MODULE_STRING 扩展为由它所在的模块的名称组成的字符串
?FILE 扩展为它所在的文件名
?LINE 扩展为它所在的行号
?MACHINE 扩展使用到的虚拟机,到目前为止,唯一可能值为BEAM

include文件

习惯将记录和宏都放入一个include文件中,使它们能够在项目的多个模块中共享。

通常在module和export指令之后使用-include指令导入include文件:

-include("File.hrl").