【问题标题】:How to get unused variable warning from the header file?如何从头文件中获取未使用的变量警告?
【发布时间】:2016-08-01 20:22:27
【问题描述】:

我正在删除使用在头文件中声明的变量的一堆 C 代码。无论出于何种原因,我的编译器都不会警告头文件中未使用的变量。从头文件调用未使用变量的选项是什么。它是从 C 文件中完成的。

【问题讨论】:

  • 您不会得到这些,因为其他 C 文件可能包含标头并使用变量。如果你想得到那些你必须暂时将它们移动到一个 C 文件中。
  • 在头文件中定义变量通常被认为是不好的做法 - 您可以声明它,但不应该定义它。如果它只是在此处声明且未使用,则编译器通常不会发出警告(它只是不做任何事情,但没有成本)。你确定你真的在那里定义变量吗?你能举一些例子吗?
  • 除非编译器可以看到所有包含foo.h的源文件,否则它无法知道foo.h声明的对象是否未被使用。听起来像是链接器的工作。
  • @chux 编译器甚至不知道它正在处理 header - 在预处理阶段之后,编译器甚至无法区分来自标头的变量和来自 .c 的变量文件。这个问题有问题。
  • @Kitcha 那么变量是在头文件中声明还是在主 .c 文件中声明没有区别 - 当变量声明和未使用时,编译器不会发出警告 - 与已定义和未使用相反

标签: c linux gcc gcc-warning


【解决方案1】:

首先,编译器本身甚至不知道变量是在头文件中还是在 .c 文件中声明的 - 在预处理器运行后,这是无法区分的。

通常在头文件中声明的是外部引用,即存储类external的变量。如果没有使用这样的变量,我知道没有编译器会发出警告 - 许多系统头文件声明了这样的变量,如果这样做,你会被警告淹没(errnostderr 是值得注意的例子 - 你不想要警告任何不使用errnostderr 的源文件)

编译器可以针对未使用的static 变量和未使用的函数参数发出警告。此类变量的使用和范围仅限于当前的编译单元或函数,并且“没有其他人可以使用它们”,因此警告是有意义的。 extern 变量可以很好地被其他目标文件使用,因为编译器将无法发出警告 - 一个适当的链接器,但是会意识到任何目标文件都没有使用外部符号并默默地删除该变量从最终的可执行文件 - 不需要警告,因为它可以由编译系统修复。

【讨论】:

    【解决方案2】:

    对于 C 编译器,头文件(包含)和任何其他 C 源文件之间没有区别。

    编译器不必针对未使用的全局数据发出警告消息,因为该数据可能被其他软件使用。

    如果您担心一条数据仅在单个目标文件的范围内使用,请尝试在此数据定义前加上 static 关键字,重新构建并运行您的软件。如果一段时间后一切正常,并且您确定任何可能的(惰性)动态链接仍然会很乐意丢失您刚刚删除的全局数据 - 删除它确实是 100% 安全的。

    【讨论】:

    • 您的最后一个建议可能不是一个好主意:如果具有相同 static 定义(static始终定义)的相同标头包含在 15 源中文件,您将有 15 个相同变量的实例分布在您的代码中 - 而如果您保持原样(没有 static)链接器会抱怨多个定义。您的提议仅在 .c 文件中才有意义。
    • 再想一想,您会收到未使用 statics 的警告 - 所以它可能真的有助于检测不使用该变量的地方。
    • 只要你的回答这么说 ;) 目前,它没有
    • 第三个想法,我不能给你+1,因为你建议在标题中声明 - 我不同意。
    • @tofro 在头文件中声明?给我看一个说它是对的程序员,我们会一起责怪他:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    相关资源
    最近更新 更多