2011-04-04 65 views
1

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

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

任何提示,非常感谢。

谢谢。

回答

4

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

  • 找到所有.h文件
  • 带龙头 “./”
  • 在行
  • 的开头添加#include "在行
  • 重定向的末尾添加"给master.h

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

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

+1

sed的一次调用可以采用多个-e选项(按顺序处理)。 – 2011-04-04 10:31:11

+0

@詹姆斯:太好了,谢谢。回答编辑。 – pmg 2011-04-04 10:45:16

4

你在正确的轨道上。就个人而言,我会使用find并将输出传递给一个文件。喜欢的东西:

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

而且,你要在你的makefile应对依存产生,因此如果这些头一个拿到的改变使将可以重新编译依赖于它的对象。

+0

顶级标题仅供参考。我看到很多项目提供了这样一个deader文件。 – pic11 2011-04-04 10:16:01

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 
4

其他的答案告诉你如何做到这一点,将工作做好,但也有一些潜在的问题,这种方法:

  • 编译时间可能更头来显著上升需要阅读在和处理。

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

  • 使得难以将项目视为一系列较小的问题和子系统。

    的功能/变量名冲突和阴影
  • 潜力(尤其是用C没有命名空间的限制范围)

更好的解决方案是正确组织项目。将它分解成子系统和库,这些子系统和头文件头向系统其余部分提供有用的有限接口,同时保持库/子系统/模块内部的实现细节。

相关问题