Erlang使用问号来识别宏。例如,考虑下面的代码:
-ifdef(debug).
-define(DEBUG(Format, Args), io:format(Format, Args)).
-else.
-define(DEBUG(Format, Args), void).
-endif.
正如文档所述,宏是在编译期间展开的。一个简单的宏?Const
将被替换为Replacement
。
这个片段定义了一个名为DEBUG
的宏,在编译时如果设置了debug
,则会被替换为调用打印字符串的函数。然后在下面的代码中使用了该宏:
?DEBUG("Creating ~p for N = ~p~n", [First, N]),
如果设置了debug
,则此语句将被展开并替换为适当的内容。因此,只有在设置了debug
时才能看到调试消息。
更新
感谢@rvirding:
问号表示尝试将其后面的内容展开为宏调用。没有任何禁止将宏名称(原子或变量)用作普通原子或变量。因此,在[上述]示例中,您可以像使用正常变量一样使用
DEBUG
,只要不以?
为前缀即可。令人困惑,但绝对不是非法的。
DEBUG
用作普通变量。这确实很令人困惑,但并非违法。 - rvirding?表示宏。
Erlang也有预定义的宏。例如:?MODULE。您可以在https://www.erlang.org/doc/reference_manual/macros.html#predefined-macros中找到完整的列表。