【问题标题】:how to write makefile when two header files include eachother in c++? [duplicate]当两个头文件在c ++中相互包含时如何编写makefile? [复制]
【发布时间】:2014-07-12 21:47:16
【问题描述】:

我最近开始学习如何编写 makefile,并且我有一个问题,我觉得它似乎有一个简单的答案。那就是当两个头文件相互包含时,我们如何编写makefile?我已经搜索了它的答案,但我找不到任何东西。 (我希望makefile的内容尽可能简单)

【问题讨论】:

  • 两个头文件不能互相包含。
  • @juanchopanza 所以这个问题没有答案吗?
  • 如果你使用包含头,这应该没问题,你制作的文件应该只编译源代码吗?
  • 好吧,重构你的代码,这样你就没有循环包含依赖项了。
  • 两个包含彼此的头文件应该没问题,只要它们都具有重新包含保护并且它们定义和期望的东西可以正确排列以便我认为可以正常工作。不过,这一事实与 make 完全无关。

标签: c++ makefile header-files


【解决方案1】:

最初,只关注 Makefile 问题:

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

例如,你有 foo.cpp。

foo.cpp 会产生 foo.o

所以你的目标是 foo.o,这取决于 foo.cpp。

foo.o: foo.cpp

现在,如果 foo.cpp 包含头 bar.hpp,您可以将其添加为依赖项(即,如果 bar.hpp 发生更改,您希望重新编译 foo.o),然后将其添加到依赖项列表中:

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.o 目标的生成涉及读取所有三个文件的单个步骤。

在 C/C++ 预处理器级别,您应该在每个头文件中使用包含防护(例如 #ifndef XXX #define XXX ....#endif)来防止多重包含。

现在这会使循环包含成为无操作...可能会使您的编译失败(一个难以发现的问题),因为其中一个定义不会是您期望的位置。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2016-04-13
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多