包含目录中的所有文件?
Posted
技术标签:
【中文标题】包含目录中的所有文件?【英文标题】:Include all files in a directory? 【发布时间】:2011-03-04 22:41:16 【问题描述】:如何实现以下代码的目的?
#include "dir/*"
【问题讨论】:
你为什么要这样做? 这很糟糕。如果您无法确定需要包含您自己项目中的哪些文件,那么您一定有一些糟糕的设计。 我有一个文件夹,其中包含游戏中所有可绘制实体的具体类。在主逻辑文件中,我需要包含所有这些类。目前,每次我创建一个新的具体类(atm 每个都有自己的 .h 和 .cpp 文件)时,我都必须为逻辑文件添加#include,而我只是想跳过每次都必须做的那一行.也许我应该将所有具体的类放在一个文件中,或者使用命名空间(但我不这么认为),你能提出任何改进我的设计的方法吗? 如果您正在编辑dir/
中的文件,并且您的文本编辑器保存了一个名为dir/somefile.h~
、dir/#somefile.h#
或dir/somefile.h.tmp
的临时/备份文件,您是否也想包含它?
请注意,#include ""
的解释实际上取决于编译器。它可能会有所帮助并将\
解释为您的路径,甚至将*
解释为通配符。你不能依赖它。在实践中,MSVC 很有帮助,可以将/
翻译成原生的\
;但 AFAIK 没有编译器扩展 *
.
【参考方案1】:
在 Bash 中:
HEADER=all_headers.h
echo "#ifndef __ALL_HEADERS__" > $HEADER
echo "#define __ALL_HEADERS__" >> $HEADER
for file in dir/*.h
do
echo "#include <$file>" >> $HEADER
done
echo "#endif" >> $HEADER
【讨论】:
您能解释一下在 Windows 机器上做什么吗? @ArmanBimatov 抱歉,necro,但 Batch 等效项基本相同,Powershell 使用相同的想法。只需谷歌“遍历目录 cmd 中的所有文件”(或最后的 Powershell,如果你愿意的话)并用它替换for
循环。
请注意,一般情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说: — 以下划线开头的所有标识符以及大写字母或另一个下划线始终保留用于任何用途。 — 所有以下划线开头的标识符始终保留保留用作普通和标记名称空间中具有文件范围的标识符。 另见What does double underscore (__const
) mean in C?
另外,您可以使用 echo "#ifndef ALL_HEADERS_INCLUDED"; echo "…"; for … done; echo "#endif"; > $HEADER
进行单次输出重定向。您可以在大括号内使用换行符;在右大括号之前必须有一个分号或换行符。 (见:How do I redirect the output of an entire shell script within the script itself?)【参考方案2】:
如果不事先运行生成所有#include 语句的脚本,您就无法做到。
每个#include 语句预处理器只能处理一个文件,因此对于您希望包含在预处理中的每个文件,它都需要一个实际的#include。
【讨论】:
【参考方案3】:实现这一点的一种方法是编写一个方便的标头,其中包含您想要的所有标头。请记住,包含您不会使用的标头可能会不必要地增加编译时间。
【讨论】:
或者如果您要使用预编译头文件,它可以减少编译时间。【参考方案4】:看看Boost 是如何为utility.hpp
做这件事的。
$ cat /usr/include/boost/utility.hpp
// Boost utility.hpp header file -------------------------------------------//
<snip>
#ifndef BOOST_UTILITY_HPP
#define BOOST_UTILITY_HPP
#include <boost/utility/addressof.hpp>
#include <boost/utility/base_from_member.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/checked_delete.hpp>
#include <boost/next_prior.hpp>
#include <boost/noncopyable.hpp>
#endif // BOOST_UTILITY_HPP
现在您可以使用#include <boost/utility.hpp>
。
【讨论】:
是的,这就是我目前的做法。我想我会继续这样做,因为我不想像其他答案所暗示的那样喜欢 bash。谢谢大家,java可以用*来做到这一点似乎很奇怪。 @user137790:Java 提供这种机制确实很方便。但是C++
永远不会选择方便而不是效率;而这样做正是不是有效的。它可以让您以更长的编译时间为代价节省一些击键。从长远来看,您认为哪一个支付更多?以上是关于包含目录中的所有文件?的主要内容,如果未能解决你的问题,请参考以下文章