开头总结:
头文件引用顺序问题。
问题起因:
在types.h中定义了结构体struct A
在proto.h中声明函数A *func(void) 或 void func(A *)
编译时遇到了问题,无法识别类型A...
代码结构:
1.mytypes.h:
//代码段1
ifndef _MYTYPES_H_
define _MYTYPES_H_
typedef struct {
INT4 count;
} A;
#endif
2.myproto.h
//代码段2
#ifndef _MYPROTO_H_
#define _MYPROTO_H_
INT4 MyFuncX(A *);
A *MyFuncY(void);
#endif
3.myinc.h
//代码段3
#ifndef _MYINC_H_
#define _MYINC_H_
#include "myproto.h"
#include "mytypes.h"
#endif
4.my.c
//代码段4
#ifndef MY_C
#define MY_C
#inlude "myinc.h"
INT4 MyFuncX(A *a)
{
return a->count
}
#endif
头文件myinc.h包含了其他所有的头文件,并在my.c中包含myinc.h头文件。
问题分析:
c语言编译时,不会编译头文件,只会编译源文件(.c)。虽然报错的点在proto.h,但实际上是在编译my.c时出错。
我们可以把my.c里包含的所有头文件都展开,根据include头文件的顺序我们就会发现问题。根据代码段3展开,在展开myproto.h时,MyFuncX(A *a)使用到了未定义的类型struct A,之后在展开mytypes.h的时候才定义struct A。所以只需要把头文件引用顺序更换一下就可以解决编译问题。