是否有工具可以解析C ++项目并做出决定
头文件是否自给自足:
即如果文件Foo.cc(或Foo.h)提到某些类Bar(例如vector)
它本身包含一个头文件
定义类(定义Bar的文件,例如<vector>
)?
编辑:我想澄清:如果头文件Foo.h提到vector而其中一个包含 已包含的向量,编译器很高兴。我不希望这样。如果Foo.h提到矢量 它应该直接包含它而不依赖于另一个标题。编译器会抓住这个吗?
答案 0 :(得分:4)
编译器会为您执行此操作。许多C ++样式指南强烈建议所有.cpp文件都应该包含相应的标题作为第一个实质性include指令。
答案 1 :(得分:3)
我已经使用了一个脚本。这是一个简化版本:
#!/usr/bin/env bash
# hcheck: Check header file syntax (works on source files, too...)
if [ $# -eq 0 ]; then
echo "Usage: $0 <filename>"
exit 1
fi
for f in "$@" ; do
case $f in
*.c | *.cpp | *.cc | *.h | *.hh | *.hpp )
echo "#include \"$f\"" > hcheck.cpp
printf "\n\033[4mChecking $f\033[0m\n"
make -s hcheck.o
rm -f hcheck.o hcheck.cpp
;;
esac
done
当然,您需要Makefile
。如果你不想这样,那么用适当的make
命令替换gcc
行(不要忘记任何标志!)。如果Makefile
将对象放在当前目录以外的其他位置,您还需要调整它。
我确信有很多改进。当我告诉人们这一点时,下意识的反应是“编译标题是一个愚蠢的想法”,但它对我来说效果很好,可以用于没有来源或者不包含在源头中的标题。
答案 2 :(得分:0)
减轻达到自给自足标题目标负担的一种方法是确保宣布任何类(通常)或自由函数(有时)都有非常具体的意图,如遵守单一责任原则。通过这样做,将需要包含标头的依赖项更少。
答案 3 :(得分:0)
我不知道这样的工具。问题并不像看起来那么容易解决。例如,为了自给自足,应该包括以下哪些头文件?
#ifdef FOO
std::vector<int> getVector();
#endif
void doStuff(std::string);
可能可能不需要包含<vector>
。这取决于是否定义了FOO
,以及是否可以定义,取决于此文件之前包含的内容。
一般情况下,预处理器宏可以真正搞乱“单独”读取标题的任何尝试。