我不完全确定,但这看起来不对:
我有一个名为 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>
吗?从我糟糕的经历来看,这看起来并不合适。
答案 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