抑制Erlang“未使用的功能”警告

时间:2010-07-22 15:23:17

标签: erlang warnings

我编写了一个Erlang模块,其中并未直接调用所有内部函数。相反,有几个函数看起来像这样:

weird_func(Cmd, Args) ->
    ?MODULE:Cmd(Args).

这是一个简化的例子,但你明白了。 Erlang编译器会发出有关未使用函数的警告,实际上它们实际上是使用的,而不是直接使用。有没有办法抑制这些警告?理想情况下,我不想压制所有这些警告,而是我想告诉Erlang编译器将一些特定函数视为特殊情况。

5 个答案:

答案 0 :(得分:14)

有专门针对此的编译选项:

http://www.erlang.org/doc/man/compile.html

所以,为你的例子插入一个这样的指令:

-compile([{nowarn_unused_function, [{ wierd_function_1,Arity1 },
                                       ... ]}]).

但是关于编译器静默丢弃函数的上述警告仍然存在 据我所知。

答案 1 :(得分:11)

这不仅仅是抑制警告的问题。无法以您想要的方式调用未导出的函数。

-module(foo).
-export([f/0]).
f() -> ?MODULE:g().
g() -> ok.

1> c(foo).
./foo.erl:4: Warning: function g/0 is unused
{ok,foo}
2> foo:f().
** exception error: undefined function foo:g/0

编译器可以完全放弃未使用的未导出函数。只需使用?MODULE:F语法导出使其可用的函数。

答案 2 :(得分:6)

如果某个函数既未导出也未显式调用,则报告为未使用。所以你有两种方法:

1)导出间接使用的功能。如果您不希望从模块外部调用这些函数,可以在文档中(以及注释中)突出显示它。

2)在weird_func中明确调用每个函数:

weird_func(fun1, [A1,A2]) ->
    fun1(A1, A2);
weird_func(fun2, []) ->
    fun2();
weird_func(fun3, [A1,A2,A3]) ->
    fun3(A1,A2,A3).

后者有点冗长,但如果用户调用不存在的函数,它将为用户提供更好的错误

答案 3 :(得分:2)

你基本上有两个选择。

第一是导出功能,从而“使用”它们。这也是您的原始示例工作所必需的。

第二是使用类似的东西在本地调用函数:

weird_func(Cmd, Args) ->
   case Cmd of
      func1 -> func1(Arg1, Arg2, Arg3);
      func2 -> func2(Arg1);
      ...

(请注意,我的示例不会编译。您必须根据您调用的函数将Args参数拆分为多个部分。)

答案 4 :(得分:1)

您还可以Cmd格式传递fun func1/3,例如:

weird_func(fun func1/3, [1, 2, 3])

这样就不会删除该功能。

编辑:刚刚添加了我的评论,因此对未来的读者非常有用

相关问题