【问题标题】:How does splint know my function isn't used in another file?夹板如何知道我的函数没有在另一个文件中使用?
【发布时间】:2009-04-12 07:29:09
【问题描述】:

Splint 给了我以下警告:

encrypt.c:4:8: Function exported but not used outside encrypt: flip
  A declaration is exported, but not used outside this module. Declaration can
  use static qualifier. (Use -exportlocal to inhibit warning)
   encrypt.c:10:1: Definition of flip

既然我只在这个文件上调用了夹板,它怎么知道呢?

#include        <stdio.h>
#include        <stdlib.h>

int    flip( int a)
{
        int b;
        b = a;
        b ^= 0x000C;
        return b;
}

int     blah(int argc, char    *argv[]) {

        FILE    *fp = NULL, *fpOut=NULL;
        int             ch;
        ch = 20; flip(20); return (ERROR_SUCCESS);
}

我什至摆脱了 main ,因此它无法确定文件以任何方式完成。我完全被难住了!

【问题讨论】:

    标签: c splint


    【解决方案1】:

    您可能会发现,如果您包含声明 flip() 的标头 - 当然应该如此 - 那么 splint 不会抱怨。您还应该在标题中声明blah()

    我不完全相信这就是解释,因为根本没有使用 blah()(尽管它使用了 flip()),而且你没有提到 splint 抱怨这一点。

    但是,最好将每个函数(在 C 中)设为 static,直到您可以证明在其源文件之外需要它,然后确保有一个声明该函数的标头,并且header 用于定义函数的文件和使用函数的每个文件中。

    在 C++ 中,“每个函数都应该是 static”建议变成“每个函数都应该在匿名命名空间中定义”。

    【讨论】:

    • +1,如果一个函数是公共的,它应该在头文件中声明,否则它应该是静态的。
    • 你是对的......在头文件中向前声明它会关闭它,它也在抱怨 blah。
    【解决方案2】:

    既然我只在这个文件上调用了夹板,它怎么知道呢?

    你已经回答了你的问题。您已经将一个文件提供给 lint,因此 lint 知道只有一个文件需要处理(当然,除了标准头文件之外)。

    【讨论】:

      【解决方案3】:

      int flip() 没有被声明为静态的,因此它可以潜在地在外部使用。由于您仅使用一个源文件调用了夹板,因此它正确地说明了您的函数,如果未在外部使用,则必须声明为静态

      【讨论】:

        【解决方案4】:

        它只能报告它所看到的。如果您比它所说的更清楚,请忽略警告或按照说明禁止它。不要假设这样的工具一定比你更了解你的程序。

        如果它确实不打算在文件之外使用,您可以将其声明为静态的,它应该可以解决问题,但其他文件将无法访问它。

        【讨论】:

        • 但这就是重点……如果我把它放到另一个文件中,警告就会消失!?!?!?!??!
        • 夹板的诊断是正确的,在其输入的范围内(即计算机程序唯一可能的正确类型)。问题是您将其解释为可怕的警告,而不是在给定参数的情况下生成的观察结果。您可以放心地忽略它。
        猜你喜欢
        • 2011-09-23
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多