【发布时间】:2011-04-04 18:46:05
【问题描述】:
如何生成包含所有子目录中所有其他头文件的顶级包含文件?
我正在处理一个包含许多子目录和这些子目录中的许多头文件的大型项目。子目录包含更多的子目录,并且这些子目录有更多的头文件。它是一棵类似多层结构的大树。我想向不想手动包含标题的用户提供顶级头文件。顶级头文件应包括所有其他具有相对路径的头文件。我正在下沉以使用 sed 或 awk 自动化该过程,但不知道如何开始。
非常感谢任何提示。
谢谢。
【问题讨论】:
如何生成包含所有子目录中所有其他头文件的顶级包含文件?
我正在处理一个包含许多子目录和这些子目录中的许多头文件的大型项目。子目录包含更多的子目录,并且这些子目录有更多的头文件。它是一棵类似多层结构的大树。我想向不想手动包含标题的用户提供顶级头文件。顶级头文件应包括所有其他具有相对路径的头文件。我正在下沉以使用 sed 或 awk 自动化该过程,但不知道如何开始。
非常感谢任何提示。
谢谢。
【问题讨论】:
find . -name '*.h' | sed -e 's/\.\///' -e 's/^/#include "/' -e 's/$/"/' >> master.h
#include "
"
但我不确定这是不是个好主意。
我宁愿只包含必要的标头,并使所需的标头数量尽可能少。
【讨论】:
你在正确的轨道上。就我个人而言,我会使用 find 并将输出通过管道传输到文件中。比如:
find . -name "*.h" -print > myBigHeader.h
此外,您还需要在 makefile 中处理依赖项生成,以便如果其中一个标头发生更改,make 将能够重新编译依赖它的对象。
【讨论】:
其他答案告诉您如何做到这一点并且效果很好,但是这种方法存在一些潜在问题:
随着需要读入和处理更多标头,编译时间可能会显着增加。
对任何头文件的更改将意味着使用您的全局头文件的所有代码都将被重新构建,即使它实际上并未使用已更改的部分。
很难将项目视为较小问题和子系统的集合。
潜在的函数/变量名称冲突和阴影(尤其是在没有命名空间限制范围的 C 语言中)
更好的解决方案是正确组织您的项目。将其分解为子系统和库,它们的标头向系统的其余部分公开有用的有限接口,同时将实现细节保留在库/子系统/模块内部。
【讨论】:
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
【讨论】: