当两个头文件在c++中相互包含时,如何编写makefile

how to write makefile when two header files include eachother in c++?

本文关键字:包含时 makefile 何编写 c++ 两个 文件      更新时间:2023-10-16

我最近开始学习如何编写makefile,我有一个问题,对我来说似乎有一个简单的答案。当两个头文件相互包含时,我们如何编写makefile ?我一直在寻找这个问题的答案,但一无所获。(我希望makefile的内容尽可能简单)

最初,只关注Makefile问题:

对象依赖于源文件…在编译期间读取的所有源文件(和头文件)上…除非您正在进行代码生成,否则用于生成特定对象的源/头文件之间没有makefile依赖关系。

例如:foo.cpp.

foo.cpp将生成foo.o

你的目标是foo。噢,那得看foo.cpp了。

foo.o: foo.cpp

现在,如果foo.cpp包含一个header bar.hpp,你可以添加它作为一个依赖项(例如,如果bar.hpp改变了你想要的foo. hpp)。(要重新编译),然后将其添加到依赖项列表中:

foo.o: foo.cpp bar.hpp

现在,如果bar.hpp包含rec.hpp,我们也会这样做。

foo.o: foo.cpp bar.hpp rec.hpp

如果rec.hpp包含bar.hpp,你不需要把它添加到依赖项中,因为它已经存在了。

注意,我们没有foo.cpp对bar.hpp的依赖,也没有bar.hpp对rec.hpp的依赖,因为foo.cpp的生成是由bar.hpp生成的。O目标只涉及一个步骤,读取所有三个文件。

在C/c++预处理器级别,包含保护可以防止多个包含(例如#ifndef XXX #define XXX ....)#endif),你应该在每个头文件。

现在这使得循环包含为no-op…可能会导致编译失败(很难发现问题),因为其中一个定义不在您期望的位置。

如何管理循环类型引用取决于引用的性质。在许多情况下,您可以(并且应该)使用其中一种类型的前向声明。在其他情况下,您可以将引用移动到实现中,从而消除循环依赖。