我正在努力从frankenstein和一个成千上万行的程序转变为结构良好,有组织的多文件程序。现在似乎很自然(天真)的是为我的三个文件制作一个包含标题的三角形: -
file_1包含file_2,file_4
file_2包括file_3,file_4
file_3包括file_1 ....等等
这些文件包含我需要在其他文件之间的变量,方法,结构等。
当然,我遇到双重包含错误。
我的问题:我应该通过在标头中使用预处理程序指令来避免这些问题(例如,在标题中包含结构,方法等),或者我应该使用makefile编译(我是听也可以用来解决这个问题---但我从未做过一个)?
答案 0 :(得分:13)
您应该始终使用include guards,以便在需要时可以包含公共头文件。这实际上与Makefile或您选择使用的任何构建工具无关。
如果可能,您还应该尝试避免循环依赖,否则您需要使用forward declarations来解决它们。
答案 1 :(得分:3)
包含声明和共享结构等的预处理程序指令和标头是可行的方法。 Makefile只是帮助编译源代码并将目标文件链接到外部库以形成最终的二进制文件,它将无助于解决多包含问题。 简而言之,在头文件中声明以下内容:
使用#IFNDEF
和#ENDIF
保护它们,然后将头文件包含在各种.c文件中......
答案 2 :(得分: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”,否则它不包括它
答案 3 :(得分:1)
头文件应该只包含绝对必要的头文件。这意味着如果您从一个类派生或从另一个头文件中明确地使用一个类作为成员。
如果你只使用引用或指向类的指针,那么只转发声明它(不包括heder文件)。
通过这种方式,您可以打破循环标头包含。
注意:您应该始终使用标题保护,因为标题可能包含在头文件用户不明显的多个路径中。