宏
宏允许在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").