c++ - 查找未使用的包含标题的工具?

标签 c++ coding-style header-files

我知道PC-Lint可以告诉您包含但未使用的标题。有没有其他工具可以做到这一点,最好是在 linux 上?

我们有一个庞大的代码库,在过去的 15 年中已经看到了大量的功能在移动,但是当功能从一个实现文件移动到另一个实现文件时,剩余的 #include 指令很少被删除,这给我们留下了相当大的困惑这点。我显然可以做一些艰苦的事情,即删除所有#include 指令并让编译器告诉我要重新包含哪些指令,但我宁愿反过来解决问题——找到未使用的指令——而不是重建使用过的指令列表。

最佳答案

免责声明:我的日常工作是为一家开发静态分析工具的公司工作。

如果大多数(如果不是全部)静态分析工具没有某种形式的 header 使用检查,我会感到惊讶。您可以使用 this维基百科页面获取可用工具列表,然后通过电子邮件向公司询问。

您在评估工具时可能会考虑的几点:

对于函数重载,您希望所有包含重载的 header 都可见,而不仅仅是包含由重载决议选择的函数的 header :

// f1.h
void foo (char);

// f2.h
void foo (int);


// bar.cc
#include "f1.h"
#include "f2.h"

int main ()
{
  foo (0);  // Calls 'foo(int)' but all functions were in overload set
}

如果你采取蛮力方法,首先删除所有头文件,然后重新添加它们直到它编译,如果先添加'f1.h',则代码将编译但程序的语义已经改变。

当你有部分和特化时,类似的规则也适用。是否选择专业并不重要,您需要确保所有专业都是可见的:

// f1.h
template <typename T>
void foo (T);

// f2.h
template <>
void foo (int);

// bar.cc
#include "f1.h"
#include "f2.h"


int main ()
{
  foo (0);  // Calls specialization 'foo<int>(int)'
}

对于重载示例,蛮力方法可能会导致程序仍然可以编译但具有不同的行为。

您可以注意的另一种相关分析类型是检查类型是否可以前向声明。考虑以下几点:

// A.h
class A { };

// foo.h
#include "A.h"
void foo (A const &);

// bar.cc
#include "foo.h"

void bar (A const & a)
{
  foo (a);
}

在上面的例子中,'A'的定义不是必需的,所以头文件'foo.h'可以被改变,使它有一个只针对'A'的前向声明:

// foo.h
class A;
void foo (A const &);

这种检查也减少了头部依赖。

关于c++ - 查找未使用的包含标题的工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1301850/

相关文章:

coding-style - 在新工作中继承应用程序

java - Java 枚举应该在它们自己的文件中定义吗?

python - `pass` 标记缩进代码块结束的关键字

C++ 循环 header 包括

C header : compiler specific vs library specific?

linux - 向Linux内核添加头文件

c++ - 错误 : variable or field ‘myfunction’ declared void

c++ - 定义重复的异常规范是否合法

c++ - 线程中的 Accept() 以避免 "blocking"套接字

c++ - 具有不同名称的多个图像存储kinect