如何生成顶级包含文件

时间:2011-04-04 09:39:25

标签: c++ c linux

如何生成顶级包含文件,其中包含来自所有子目录的所有其他头文件?

我正在处理一个包含许多子目录和这些子目录中的许多头文件的大型项目。子目录包含更多子目录,这些子目录具有更多头文件。它是一个像多层次结构的大树。我想为不想手动包含标头的用户提供顶级标头文件。顶级头文件应包含具有相对路径的所有其他头。我正在尝试用sed或awk自动化这个过程,但不知道如何开始。

非常感谢任何提示。

感谢。

4 个答案:

答案 0 :(得分:4)

你走在正确的轨道上。就个人而言,我会使用find并将输出管道传输到文件中。类似的东西:

 find . -name "*.h" -print > myBigHeader.h

此外,您还需要在makefile中处理依赖项生成,以便在其中一个标题被更改后,make将能够重新编译依赖于它的对象。

答案 1 :(得分:4)

find . -name '*.h' | sed -e 's/\.\///' -e 's/^/#include "/' -e 's/$/"/' >> master.h

  • 查找所有.h文件
  • 剥离领先的“./”
  • 在行
  • 的开头添加#include "
  • 在行尾添加"
  • 重定向到master.h

但我不确定这是个好主意。

我宁愿只包含必要的标题,并尽可能减少所需的标题数量。

答案 2 :(得分:4)

其他答案告诉您如何做到这一点并且运作良好,但这种方法存在一些潜在的问题:

  • 编译时间可能会随着更多标题需要读入和处理而显着增加。

  • 对任何头文件的更改都意味着将重建使用您的全局头文件的所有代码,即使它实际上没有使用已更改的部分。

  • 使得将项目视为较小问题和子系统的集合变得更加困难。

  • 函数/变量名称冲突和阴影的可能性(特别是在C中没有名称空间来限制范围)

更好的解决方案是正确组织您的项目。将其分解为子系统和库,这些子系统和库具有向系统其余部分公开有用的有限接口的头部,同时将实现细节保留在库/子系统/模块内部。

答案 3 :(得分:2)

echo "#ifndef INCLUDEALLH" > includeall.h
echo "#define INCLUDEALLH" >> includeall.h
find . -name \*.h | sed 's,^[.]/,,' | while read line; do echo "#include \"$line\""; done >> includeall.h
echo "#endif" >> includeall.h