【问题标题】:Checking for redundant included header files检查冗余包含的头文件
【发布时间】:2011-03-05 17:08:29
【问题描述】:

有没有办法找出 C/C++ 源文件中包含的所有冗余头文件?

【问题讨论】:

  • 试试这个问题的答案:stackoverflow.com/questions/42308/…
  • @In silico:这是查找 all 依赖项的方法。我认为 OP 正在询问 redundant #inclusions。我通过删除#includes 然后尝试编译来找到它们。我知道没有工具可以自动完成,这对于如此简单和重复的任务来说很奇怪。
  • 冗余是不必要的还是包含多次?
  • 冗余是什么意思?如果您包含多次,那么您只是在包含守卫方面失败 - 否则它不会花费您任何费用,因为守卫会阻止包含。如果您正在寻找不必要的过滤,请查看stackoverflow.com/questions/1301850/…
  • @R Samuel Klatchko:不必要的包含

标签: c++ c


【解决方案1】:

您也可以在程序中使用#ifdef 来欺骗它。为此,您的标题将需要有一些不同的变量。如果它存在它的定义..

【讨论】:

  • 我试图找出多余的头文件,而不是所有包含的头文件的列表
  • 不清楚这如何确定您是否需要此文件中的其他符号?
【解决方案2】:

我使用 doxygen(与 graphviz 一起)来获取包含图。然后,“冗余”包括传递弧,即在较长路径上引入捷径的弧。

【讨论】:

  • 不是一般情况:如果标题 A 包含标题 B,并且如果没有记录标题 A 包含标题 B,那么您仍然必须包含标题 B 才能使用标题 B 中的某些内容。
  • 您能多解释一下,即如何使用它们吗?或为此提供任何教程链接。
  • 您可以在此处找到 doxygen 的文档:stack.nl/~dimitri/doxygen 如果您希望它也能生成漂亮的调用/包含/任何图形,您还必须安装 graphviz。两者都应该在任何最近的 linux 发行版中都可用。 (不知道 windows...) Doxygen 有一个配置文件,您应该编辑它以打开包含图的功能。所有这些都有很好的记录,是他们提供的默认文件。通常您会为 doxygen 注释您的代码以生成文档,但出于您的目的,源代码也应该没问题。
【解决方案3】:

这是一个复杂的问题。它可以解释为以下两种方式之一:

  1. 您想删除不提供任何内容的#include。
  2. 您想查找递归包含。

1 可能不是必需的。包括只是为编译器提供信息,它们不应该在其中进行分配。即使他们这样做而您不这样做,编译器也会将其删除。如果您真的想这样做,您可以开始删除您认为不需要的包含,直到出现“隐式声明...”错误。

对于 2,您通常不必担心。使用唯一的#def 是很常见的做法,即:

#ifndef __MY_LIB_H
#define __MY_LIB_H
...
#endif

如果定义已经存在,这将导致库胆量被省略。

如果您控制所有或大部分库,您可以将 #ifndef 更改为:

#ifdef __MY_LIB_H
#error "Lib included recursively"
#else
...
#endif

【讨论】:

  • 去除多余/多余的包含可以加快编译时间。对于大型系统,这可能变得非常有意义。
  • 在命名#include-guards 时不要使用两个前导下划线(或下划线后跟一个大写字母)。这些名称是为编译器保留的。
  • @Jon L:我正在寻找处理案例一的东西,即You want to remove #includes that don't provide you anything.
  • @jamesdlin 在写完这篇文章后的某个时间,我对此进行了讨论。我通常只使用 '_' 不过我会更加小心,谢谢。
  • @Ravi 我在一般情况下说得更多。虽然有争议,但您应该能够检查您不需要的内容。如果你有很多代码,那将是一个真正的问题。嗯......我确信有一个工具可以做到这一点。基本上你想“cscope”所有非本地函数,然后生成唯一列表。
【解决方案4】:

请注意,冗余包含在这里可能是一件好事,因为它提供了头文件的自包含。 IE。如果 B 包含 A,而 C 包含 B 和 A:

headera.h

headerb.h
#include "headera.h"

headerc.h
#include "headerb.h"
#include "headera.h"

您可能会争辩说,在 C 中包含 A 是多余的,因为它已经由包含 B 提供。但实际上它使 C 独立于 B 的内部结构。删除它会使 C 依赖 在 B 上包括 A。

【讨论】:

  • 但我正在寻找程序根本不需要的#include,例如 - 如果 Cc 包含,limits.h 和 Cc 实际上并没有使用其中定义的任何内容。
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2020-01-13
  • 2015-12-04
相关资源
最近更新 更多