我知道 PC-Lint可以告诉你有关标题,包括但没有使用。有没有其他工具可以做到这一点,最好是在 Linux 上?
我们拥有一个庞大的代码库,在过去的15年里,我们看到了大量的功能移动,但是当功能从一个实现文件移动到另一个时,很少有剩余的 # include 指令被删除,到目前为止,留给我们的是一个相当混乱的局面。显然,我可以费力地删除所有 # include 指令,让编译器告诉我应该重新包含哪些指令,但我宁愿反过来解决这个问题——找到未使用的指令——而不是重新构建一个使用过的指令列表。
// 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
}
#!/bin/bash
# prune include files one at a time, recompile, and put them back if it doesn't compile
# arguments are list of files to check
removeinclude() {
file=$1
header=$2
perl -i -p -e 's+([ \t]*#include[ \t][ \t]*[\"\<]'$2'[\"\>])+//REMOVEINCLUDE $1+' $1
}
replaceinclude() {
file=$1
perl -i -p -e 's+//REMOVEINCLUDE ++' $1
}
for file in $*
do
includes=`grep "^[ \t]*#include" $file | awk '{print $2;}' | sed 's/[\"\<\>]//g'`
echo $includes
for i in $includes
do
touch $file # just to be sure it recompiles
removeinclude $file $i
if make -j10 >/dev/null 2>&1;
then
grep -v REMOVEINCLUDE $file > tmp && mv tmp $file
echo removed $i from $file
else
replaceinclude $file
echo $i was needed in $file
fi
done
done