正确使用头文件?
最近我一直在使用头文件将我的程序拆分成单独的文件(包含函数和头文件的C文件声明它们)。 一切正常,但出于某种原因,我需要在每个C文件中包含和
…或者我的项目无法编译。 这是预期的行为吗?
C模块需要知道如何定义某些内容,或者知道定义的位置。 如果定义位于头文件中,则应将其包含在使用它的模块中。 以下是有关头文件的信息的链接 。
答案取决于该函数是否可能依赖于其他.c / .h文件中的其他声明函数。
例如:
filea.c
:
#include "filea.h"; methodA() { methodB(); }
fileb.c
:
#include #include "fileb.h" methodB(); { somelibrarycode(); }
除非filea.c
包含filea.c
的头文件,否则这将无法编译,因为它具有一些未解析的外部依赖项。
如果这不是你所描述的,那么就会发生其他一些麻烦,或者你不小心静态输入了函数,使它们无法在.c
文件之外被看到。
这个问题的一个可能的解决方案是将一个shared.h
与其他所有包含在一起,但我个人不推荐这个,因为这只是掩盖了问题,而不是明显地使哪些文件依赖于什么并建立清晰的线条依赖。
它们必须以某种方式包括在内。
有些项目需要在.c文件中包含长列表,可能需要强制排序,甚至强制假设没有标题包含任何其他标题。
有些允许假设某些包括形成一些标题。
有些人使用集合标题(包括小标题列表)并用这些标题替换长列表。
有些甚至更进一步,使用编译器的“强制标头”选项,因此包含不会出现在任何地方,并声明内容是隐式假设的。 它可以在项目或整个代码库级别上进行,也可以组合使用。 它与预编译头文件相当好。
(还有更多的策略,你得到的数字,都有一些优点和缺点。)