检查冗余包含的头文件

时间:2010-06-19 06:31:43

标签: c++ c

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

4 个答案:

答案 0 :(得分:5)

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

headera.h

headerb.h
#include "headera.h"

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

  1. 您想删除不提供任何内容的#includes。
  2. 您想要寻找递归包含。
  3. 1可能不是必需的。包括只为编译器提供信息,它们不应该在其中分配。即使他们这样做而您没有这样做,编译器也会将其剥离。如果你真的想要这样做,你就可以开始删除包括你不认为你需要,直到你得到“隐含声明......”错误。

    对于2,你通常不必担心。使用唯一的#def即:

    是很常见的做法
    #ifndef __MY_LIB_H
    #define __MY_LIB_H
    ...
    #endif
    

    如果定义已经存在,这将导致库名称被忽略。

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

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

答案 3 :(得分:0)

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