在每个源文件中包含一个头文件

Posted

技术标签:

【中文标题】在每个源文件中包含一个头文件【英文标题】:Include one header file in each source file 【发布时间】:2012-04-14 06:52:00 【问题描述】:

假设您有 100 多个源文件(.c 或 .cpp)文件,并且您希望在每个文件中包含一些定义、函数/变量声明。通常在 C/C++ 中,您为此目的使用头文件。但在这种情况下,您需要在每个源文件中添加#include "header.h"。

现在我的问题是,有没有一种方法可以为所有文件包含一个标头,而无需在每个文件中添加 #include "header.h",因为编写 #include "header.h" 会非常烦人100 多个源文件。

【问题讨论】:

没有,但是你可以写一个 python 脚本在大约 5 分钟内为你完成这项工作。 @TJD,不是吗?你绝对可以做到。 @CarlNorum,很有趣,我不知道 -include 选项 【参考方案1】:

您可以将-include 标志用于clang 或GCC。来自man page:

-包括 文件

处理文件,就像"#include "file"" 出现在主源文件的第一行一样。但是,搜索 file 的第一个目录是预处理器的工作目录而不是包含主源文件的目录。如果在此处未找到,则会在 "#include "..."" 搜索链的其余部分中正常进行搜索。

如果给出了多个 -include 选项,文件将按照它们在命令行中出现的顺序被包含。

例子:

clang -include header.h -c file1.c
clang -include header.h -c file2.c
clang -include header.h -c file3.c
clang -o app file1.o file2.o file3.o

MSVC 有/FI flag,类似。

【讨论】:

是的,我只使用 clang 或 gcc 进行编译。但我在网上找不到任何例子。你介意分享一个。谢谢。【参考方案2】:

您可以使用 unix 管道解决此问题

find ./ -name "*.c" -or -name "*.cpp" | xargs -n 1 sed -i '1 i #include <my_header.h>'

【讨论】:

【参考方案3】:

你不能这样做,尽管你可以写一个脚本让你这样做。获取每个文件并在顶部写入#include "header.h" 的脚本。 编辑:gcc 中的-include 执行此操作。

但是,您需要通过编译器选项以不同的方式实现。在 gcc 中,使用-D

假设您希望在所有源文件中将 DEBUG_LEVEL 定义为 2。您可以通过像这样调用 gcc 来简单地做到这一点:

gcc -DDEBUG_LEVEL=2

请注意,在这种情况下,您需要重新构建您的所有项目(如果您在所有源文件所依赖的 1 个头文件中更改了此定义,无论如何都会重新构建)

【讨论】:

是的,我知道 -D 选项,但它只是标题中#define 的替代品。通常头文件中还有其他内容,例如声明、宏等。【参考方案4】:

头文件不是定义——它们是声明。

您尽可能少地投入 - 节省编译器工作和相互依赖关系。

您甚至可以通过在这些头文件中使用前向声明来进一步减少数量。

如果你很聪明,你可以让你的 IDE 帮助你填补空白而不是伤到你的手指。

【讨论】:

“头文件不是定义——它们是声明”——它们通常是混合的:对于占用可执行空间的东西,它们往往是声明,但对于类、模板、内联函数之类的东西——定义。前向声明是 - 恕我直言 - 不好的做法 - 您应该更喜欢额外的前向声明头,例如 - 标准库的 &lt;iosfwd&gt; - 这样包含的层次结构确保一致性和所有权与声明的组件 - 它确保在类型时重新编译工作替换为特定模板实例化的 typdef。 @TonyDelroy - 声明是说事情会发生的事情。至于内联函数,它们根本不需要编译!如果.cpp 文件需要它们——那么编译器只会填充添加它。至于前向声明,它们节省了大量的编译和开发时间。阅读 Scott Myers 所著的有关该主题的书 - 很少需要包含文件才能编译代码。毕竟,任何使用它的代码都需要包含该部分。其他不使用包含文件的这些组件的代码可以通过前向声明忽略它。 @TonyDelroy IMO 对于标头要求客户端按特定顺序包含标头,或者标头包含其他标头,或者标头是整体而不是拆分成逻辑、设计良好的标头,这是不好的做法模块。为了避免这些事情,通常需要前向声明。而且我看不出前向声明的缺点在哪里。 @bames53:客户不需要关心订单。但是,也许您应该查看您的操作系统和标准库头文件,以了解它们包含其他头文件的实际原因。重新标头整体与设计良好-暗示确实如此-使用它的整体意味着过度包容,然后将其与精心设计的对比... :-)。 “看不到......缺点” - 你是否按照我上面关于模板和 typedef 的说法进行操作?也许您应该创建几个文件并进行实验。从维护的角度来看,前向声明是脆弱的。 @bames53: re templates/typedefs - 可以查看***.com/questions/4928837/… 以获得解释...

以上是关于在每个源文件中包含一个头文件的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中包含来自单独文件夹的文件

vS 2008 中包含头文件vector的问题:

根据内容在linux中拆分文件[重复]

根据内容在linux中拆分文件[重复]

c语言在头文件中如何引用另一个头文件中的函数

调用C++类中另一个头文件中定义的函数[重复]