抑制Erlang"未使用的功能"警告

Nic*_*ick 6 erlang warnings

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

weird_func(Cmd, Args) ->
    ?MODULE:Cmd(Args).
Run Code Online (Sandbox Code Playgroud)

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

小智 15

有一个专门用于此的编译选项:

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

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

-compile([{nowarn_unused_function, [{ wierd_function_1,Arity1 },
                                       ... ]}]).
Run Code Online (Sandbox Code Playgroud)

但是上面关于编译器默默地丢弃函数的警告仍然是我所知道的.


cth*_*ops 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
Run Code Online (Sandbox Code Playgroud)

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


Zed*_*Zed 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).
Run Code Online (Sandbox Code Playgroud)

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

  • 我猜 2) 不是一个选项,当你使用 {weird_result } -> spawn(?MODULE, fun1, [params]); (2认同)