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

时间:2012-06-10 20:57:09

标签: c++ include dependencies header-files

是否有工具可以解析C ++项目并做出决定 头文件是否自给自足: 即如果文件Foo.cc(或Foo.h)提到某些类Bar(例如vector) 它本身包含一个头文件 定义类(定义Bar的文件,例如<vector>)?

编辑:我想澄清:如果头文件Foo.h提到vector而其中一个包含 已包含的向量,编译器很高兴。我不希望这样。如果Foo.h提到矢量 它应该直接包含它而不依赖于另一个标题。编译器会抓住这个吗?

4 个答案:

答案 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,以及是否可以定义,取决于此文件之前包含的内容

一般情况下,预处理器宏可以真正搞乱“单独”读取标题的任何尝试。