0

最近我一直在使用头文件将我的程序分成单独的文件(C 文件包含函数和声明它们的头文件)。一切正常,但由于某种原因,我需要在每个 C 文件中包含<stdio.h><stdlib.h>...否则我的项目无法编译。这是预期的行为吗?

4

3 回答 3

1

C 模块需要知道某些东西是如何定义的,或者它可以在哪里找到定义。如果定义在头文件中,那么您应该将它包含在使用它的模块中。这是有关头文件的信息的链接。

于 2012-08-13T23:06:42.113 回答
0

答案将取决于该函数是否可能依赖于其他 .c/.h 文件中的其他声明函数。

例如:

filea.c

#include "filea.h";

    methodA()
    {
        methodB();
    }

fileb.c

#include <somelibrary.h>
#include "fileb.h"


    methodB();
    {
        somelibrarycode();
    }

filea.c除非包含头文件,否则不会编译,fileb.h因为它有一些未解析的外部依赖项。

如果这不是您所描述的,那么就会发生其他一些意大利面化,或者您不小心静态类型化了函数,防止它们在.c文件之外被看到。

这个问题的一种可能的解决方案是使用一个shared.h包含所有其他包含的单一文件,但我个人不建议这样做,因为这只是掩盖了问题,而不是很容易地明确哪些文件依赖于什么并建立明确的依赖关系。

于 2012-08-13T23:05:19.507 回答
0

它们必须以某种方式包含在内。

一些项目需要在 .c 文件中包含很长的列表,可能需要强制排序,甚至强制假设没有标题包含任何其他标题。

有些允许假设一些包含一些标题。

有些使用集合标题(包括小标题列表)并用这些替换长列表。

有些更进一步,使用编译器的“强制标头”选项,因此 include 不会出现在任何地方,并声明要隐式假定的内容。它可以在项目或整个代码库级别上进行,也可以组合在一起。它与预编译的头文件配合得很好。

(还有更多的策略,你明白了,都有一些优点和缺点。)

于 2013-06-05T13:18:15.027 回答