C++检查标头是自给自足的

C++ checking headers are self-sufficient

本文关键字:自给自足 检查 C++      更新时间:2023-10-16

是否有工具可以解析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 "n33[4mChecking $f33[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,以及可能会也可能不会定义,具体取决于此文件之前包含的内容

通常,预处理器宏确实会弄乱任何"隔离"读取标头的尝试。