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