C/C++ 头文件中使用另一个头文件中的结构体

开头总结:

头文件引用顺序问题。

问题起因:

在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。所以只需要把头文件引用顺序更换一下就可以解决编译问题。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值