5

我正在努力从 frankenstein 和一个文件的数千行程序转变为结构良好且组织良好的多文件程序。现在似乎很自然(天真)的是为我的三个文件制作一个包含头文件的三角:
file_1 包括 file_2,file_4
file_2 包括 file_3,file_4
file_3 包括 file_1 .... 等等
这些文件有变量,我在其他文件之间需要的方法、结构等。

当然,我遇到了双重包含错误。

我的问题:我应该通过在标头中使用预处理器指令(例如,完全在标头中包括结构、方法等)来避免这些问题,还是应该使用 makefile 进行编译(我听说它也可以用来解决这个问题- ——但我从来没有做过)?

4

4 回答 4

13

您应该始终使用包含保护,以便您可以在需要时包含您的公共头文件。这实际上独立于 Makefile 或您选择使用的任何构建工具。

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

于 2011-02-15T07:09:59.907 回答
3

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

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

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

于 2011-02-15T07:28:47.490 回答
1

“inv_tree.h”的包含保护的示例是

#ifndef INV_TREE_H
#define INV_TREE_H
...
#endif

通过用守卫包围“inv_tree.h”的内容,它会检查天气 INV_TREE_H 在包含“inv_tree.h”之前是否已定义。如果未定义,则定义它并包含“inv_tree.h”,否则不包含它

于 2011-02-15T07:29:55.790 回答
1

头文件

头文件应该只包含绝对必要的头文件。这意味着如果您从一个类派生或显式使用一个类作为成员,则来自另一个头文件。

如果您只使用引用或指向类的指针,则只需转发声明它(不包括 heder 文件)。

通过这种方式,您可以打破循环标头包含。

注意:您应该始终使用标头保护,因为标头可能通过多个路径包含在您的头文件用户中并不明显。

于 2011-02-15T08:11:05.203 回答