避免双重包含:预处理器指令与makefile

Dil*_*rix 5 c++ makefile multiple-inclusions c-preprocessor

我正在努力从frankenstein和一个成千上万行的程序转移到结构良好,有组织的多文件程序.现在似乎很自然(天真)的是为我的三个文件做一个标题包含的三角形:
file_1包含file_2,file_4
file_2包含file_3,file_4
file_3包含file_1 ....等等
这些文件有变量,我需要在其他文件之间的方法,结构等.

当然,我有双重包含错误.

我的问题:我应该通过在头文件中使用预处理程序指令来避免这些问题(例如,在头文件中完全包含结构,方法等),或者我应该使用makefile编译(我听说也可以用来解决这个问题 - - 但我从未做过一个)?

sjr*_*sjr 13

您应该始终使用包含警卫,以便您可以在需要时包含公共头文件.这实际上与Makefile或您选择使用的任何构建工具无关.

如果可能,您还应该尝试避免循环依赖,否则您将需要使用前向声明来解决它们.

  • @Martin York:"循环依赖"和"循环"之间有什么区别?我认为它们是同义词,"循环依赖"是一个不那么含糊的术语. (2认同)

whj*_*jou 4

包含声明和共享结构等的预处理器指令和标头是可行的方法。Makefiles 只是帮助编译源代码并将目标文件链接到外部库以形成最终的二进制文件,它无助于解决多重包含问题。简而言之,在头文件中声明以下内容:

  • 结构体
  • 共享变量作为 extern (并在 .c 文件之一中定义它)
  • 方法声明(并在 .c 文件之一中定义方法)

#IFNDEF和保护它们#ENDIF,然后将头文件包含到各个 .c 文件中...