Erlang的宏的定义语法如下:
|
|
宏定义可以放在模块的属性和函数声明之间的任何地方,但是,宏使用前必须被定义。如果一个宏被几个模块使用,则建议将该宏的定义放置在一个包含文件里。
宏的使用语法如下:
|
|
宏在编译期间被展开替换,如下代码:
|
|
编译期间被替换为:
|
|
有参数的宏在编译期间,其参数被实参替换,代码如下所示:
|
|
编译期间被替换为:
|
|
如果想看宏展开的效果,可以在编译模块的时候使用 ‘P’ 选项:
|
|
这将产生宏展开后的文件:File.P 。
Erlang预定义了一些宏:
|
|
除了预定义宏之外,宏是可以重载的。重载宏有多个定义,每个定义具有不同数量的参数。参数化宏在使用的时候,即使没有型参,也要加上括号。如果有型参数,则实参个数必须与型参一致。
宏可以应用于条件编译。如下指令:
|
|
注意:上述指令不能出现在函数当中。
例子如下:
|
|
如果想要LOG(X)宏真正输出内容,则在编译的时候要加上 debug 宏:
|
|
或121> c(m, {d, debug}).{ok,m}
这样?LOG(Arg)就会展开为对 io:format/2 的调用。
如果Arg是宏的参数,那么??Arg将展开为包含这个参数的字符串。这个和C语言中宏参数字符串化类似:#arg
例如:
|
|
它的结果是:
|
|