C++ 检查包含的冗余头文件

C++ 检查包含的冗余头文件,c++,c,C++,C,有没有办法找出C/C++源文件中包含的所有冗余头文件?您也可以使用#ifdef在程序中检查它。为此,您的标题将需要有一些不同的变量。如果它存在定义的..我使用doxygen(与graphviz一起)来获取包含图。然后,“冗余”包括传递弧,即在较长路径上引入捷径的弧。这是一个复杂的问题。可以用以下两种方式之一来解释: 您想删除不提供任何内容的#包含 您希望查找递归包含 1可能不是必需的。包含仅为编译器提供信息,不应包含分配。即使他们这样做而你不这样做,编译器也会死掉这个。如果您真的想这样做,您可以

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

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

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

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

  • 您想删除不提供任何内容的#包含
  • 您希望查找递归包含
  • 1可能不是必需的。包含仅为编译器提供信息,不应包含分配。即使他们这样做而你不这样做,编译器也会死掉这个。如果您真的想这样做,您可以开始删除您认为不需要的包含,直到您得到“隐式声明…”错误

    对于2,你通常不必担心。使用独特的定义是非常常见的做法,即:

    #ifndef __MY_LIB_H
    #define __MY_LIB_H
    ...
    #endif
    
    如果定义已经存在,这将导致忽略库guts

    如果您控制全部或大部分LIB,您可以将
    #ifndef
    更改为:

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

    请注意,冗余包含在这里可能是一件好事,因为它提供了头文件的自包含。即,如果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依赖于包含A的B。

    试试这个问题的答案:@in silico:这是找到所有依赖关系的方法。我认为OP是在问关于冗余包含的问题。我通过删除#includes然后尝试编译来找到它们。据我所知,没有一种工具能够自动完成这项任务,这对于这样一项简单而重复的任务来说是很奇怪的。冗余是指不必要的还是包含多次?冗余是什么意思?如果您多次包含,那么您只是在包含卫士方面失败了——否则它不会花费您任何费用,因为卫士会阻止包含。如果你在寻找不必要的过滤,请看@R Samuel Klatchko:Understand Include我正在试图找出冗余的头文件,而不是所有包含的头文件的列表不清楚这如何确定你是否需要此文件中的其他符号?不一般:如果头A包含头B,如果标题A包括标题B没有文档记录,那么您仍然必须包括标题B才能使用标题B中的内容。您能再解释一下吗,即如何使用它们?您可以在这里找到doxygen的文档:如果您希望它也能生成漂亮的call/include/which图形,您还必须安装graphviz。这两个版本都应该在最近的linux发行版中可用。(不了解windows…)Doxygen有一个配置文件,您应该编辑该文件以打开include graphs的功能。所有这些都有很好的文档记录,这是他们提供的默认文件。通常,您会为doxygen注释代码以生成文档,但出于您的目的,源代码也应该保持原样。消除冗余/多余的包含可以加快编译速度。对于大型系统,这可能非常有意义。在命名
    #include
    -guards时,不要使用两个前导下划线(或下划线后跟大写字母)。这些名称是为编译器保留的。@Jon L:我正在寻找一些东西来处理第一种情况,即
    您要删除的#includes,它不向您提供任何信息。
    @jamesdlin在写这篇文章后的某个时候,我就这一点进行了讨论。我通常只使用“u”,不过我会更小心的,谢谢。@Ravi我在一般情况下说得更多。虽然有争议,但您应该能够检查您不需要的内容。如果你有很多代码,这将是一个真正的问题。六羟甲基三聚氰胺六甲醚。。。我相信有一种工具可以做到这一点。基本上,您希望“cscope”所有非本地函数,然后生成唯一列表。但我正在寻找程序根本不需要的#include,例如,如果C.C包含,
    limits.h
    并且C.C实际上没有使用其中定义的任何内容。