stdio包含在头文件中

时间:2012-03-22 09:47:41

标签: c include header-files stdio

我不完全确定,但这看起来不对:

我有一个名为 fraction.h 的头文件,其中我存储了一个分数结构和处理它的方法,一个方法用于在文件中写一个分数,并在此签名中function one参数是 FILE 指针。

fraction.h:

...
const Fraction * fraction_fwrite(const Fraction * f, FILE * file);
...

fraction.c:

#include <stdio.h>
#include "fraction.h"
...

现在,当我尝试编译使用分数的程序时,我收到错误,

这是我在 Makefile 中的内容:

program_test: fraction.o program_test.o

我当然在 program_test.c 中包含 fraction.h 。 但我一直收到这个错误:

fraction.h:34:54:错误:未知类型名称'FILE'

有人可以解释编译器包含文件的不同步骤吗? 因为<stdio.h>位于 fraction.c 中,为什么它会触发这种不明确的错误?

我应该在 fraction.h 中加入<stdio.h>吗?从我糟糕的经历来看,这看起来并不合适。

3 个答案:

答案 0 :(得分:5)

编译program_test时,编译器不会查看其他.c文件,只查看实际编译的文件中#include的文件。

因此,您必须在测试程序中#include <stdio.h>,就像在fraction.c中一样,或者将其包含在头文件中。

尽管C标准说标准库文件不会相互包含,但没有任何说明用户定义的文件不能这样做。事实上,如果他们这样做,通常会更容易使用它们。

答案 1 :(得分:1)

当预处理器处理文件时,它会将包含文件的内容复制到预处理的文件中。您在fraction.c中未收到该错误的原因是stdio.h的内容包含在fraction.h之前。

因此预处理文件fragments.c如下所示:

    stdio.h contents
    fragment.h contents
    fragment.c contents

请注意,FILE定义将在stdio.h中引用之前通过fragment.h包含。

您应该在fraction.h中包含stdio.h以消除此错误。

答案 2 :(得分:0)

在program_test.c中包含stdio.h。如果你不在program_test.c(包括fraction.h)中包含stdio.h,编译器不知道fraction.h使用的FILE的定义,并产生错误。

而且,你真的应该在fraction.h中包含stdio.h