C++检查标头是自给自足的
C++ checking headers are self-sufficient
是否有工具可以解析C++项目并决定头文件是否自给自足:即,如果一个文件 Foo.cc(或 Foo.h)提到了某个类 Bar(例如向量),那么它本身包含一个头文件定义类(定义柱的文件,例如 <vector>
) ?
编辑:我想澄清一下:如果头文件 Foo.h 提到矢量及其包含之一已经包含向量,编译器很高兴。我不想这样。如果 Foo.h 提到矢量完全,它应该直接包含它,而不是依赖于另一个标头。编译器是否捕获了此内容?
编译器
将为您执行此操作。 许多C++样式指南强烈建议,出于这个原因,所有.cpp文件都应包含相应的标头作为第一个实质性包含指令。
我为此使用了脚本。 这是一个简化版本:
#!/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 33[4mChecking $f 33[0mn"
make -s hcheck.o
rm -f hcheck.o hcheck.cpp
;;
esac
done
当然,你需要有一个Makefile
。如果您不希望这样做,请将make
行替换为适当的gcc
命令(不要忘记任何标志!如果您的Makefile
将对象放在当前目录以外的其他位置,您还需要调整它。
我相信还有很多改进要做。当我告诉人们这件事时,下意识的反应是"编译标题是一个愚蠢的想法",但它对我来说效果很好,可以用于没有源或未首先包含在源中的标题。
减轻实现自给自足标头目标的负担的一种方法是确保声明的任何类(通常)或自由函数(有时)都有非常具体的意图,例如坚持单一责任原则。通过这样做,需要包含标头的依赖项将减少。
我不知道
有这样的工具。这个问题并不像看起来那么容易解决。例如,以下应包含哪些头文件才能自给自足?
#ifdef FOO
std::vector<int> getVector();
#endif
void doStuff(std::string);
它可能,可能不需要,需要包括<vector>
。这取决于是否定义了FOO
,以及可能会也可能不会定义,具体取决于此文件之前包含的内容。
通常,预处理器宏确实会弄乱任何"隔离"读取标头的尝试。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 检查TCHAR数组输入是否为带符号整数C++
- C++检查标头是自给自足的