抑制 Erlang“未使用的函数”警告

发布于 2024-09-10 15:41:40 字数 268 浏览 3 评论 0原文

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

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

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

I wrote an Erlang module where not all the internal functions are directly called. Instead, there's a couple functions that look something like this:

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

It's a simplified example, but you get the idea. The Erlang compiler spits out warnings about unused functions, when in fact they are actually used, just not directly. Is there some way to suppress these warnings? Ideally I don't want to suppress all such warnings, but rather I'd like to tell the Erlang compiler to consider a few specific functions as special cases.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

清旖 2024-09-17 15:41:41

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

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

因此,对于您的示例,插入这样的指令:

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

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

there is a compile option specifically for this :

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

so, for your example insert a directive like this :

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

but the above warning about the compiler silently discarding the functions still stands
as far as i know.

假扮的天使 2024-09-17 15:41:41

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

-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 语法进行调用。

It's not just a matter of suppressing the warning. An unexported function can't be called in the way you intend.

-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

The compiler is free to drop the unused, unexported function completely. Simply export the function making it available call using the ?MODULE:F syntax.

梨涡 2024-09-17 15:41:41

如果函数既未导出,也未显式调用,则将其报告为未使用。因此,您有两种方法可以选择:

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

2)在 odd_func 中显式调用每个函数:

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

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

If a function is neither exported, nor explicitly called, it is reported as unused. So you have two ways to go:

1) Export the functions that are used indirectly. If you don't want those functions to be called from outside the module, you can highlight this in the documentation (and in comments.)

2) Call each function explicitly in weird_func:

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

This latter is a bit more verbose, but it will provide better error for the users, if they call a non-existing function

客…行舟 2024-09-17 15:41:41

你基本上有两个选择。

第一个是导出函数,从而“使用”它们。这对于您的原始示例的工作也是必要的。

第二是使用类似以下内容在本地调用函数:(

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

请注意,我的示例无法编译。您必须根据您调用的函数将 Args 参数分成几部分。)

You basically have two options.

1st is to export the functions, thus "using" them. This is also necessary for your original example to work.

2nd is to call the functions locally using something like:

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

(Note that my example doesn't compile. You have to split the Args argument into pieces depending on which func you are calling.)

烟─花易冷 2024-09-17 15:41:41

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

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

这样函数就不会被删除。

编辑:刚刚添加了我的评论,以便对未来的读者有用

You can also pass Cmd in the fun func1/3 format, for example:

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

This way the function will not be dropped.

Edit: Just added my comment so it can be useful for future readers

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文