结构体内定义函数指针的问题

文章讲述了在C语言中如何正确定义一个结构体,其中包含一个函数指针成员,该成员的参数列表中需要使用结构体自身类型。错误的定义会导致编译器无法识别类型,正确的做法是在结构体内部直接使用struct定义函数指针的参数类型,并在结构体定义下方为函数指针取别名。
摘要由CSDN通过智能技术生成

有如下需求:定义一个结构体,结构体内成员含有函数指针,函数指针的参数中包括了该结构体。


错误定义1:

typedef struct _CONNECT_INFO_ST_
{
	int 					port;                 			/** 服务端端口 **/
	char 					ip[32];                			/** 服务端IP **/
	int 					handle;                  		/** 句柄 **/
	int						connect_status;        			/** 连接状态 **/
	g_recdata_callback		recdata_callback;				/** 接收数据回调函数指针 **/
} connect_info_st;

typedef void(*g_recdata_callback)(connect_info_st*, char*, int);    	/** 接收数据回调函数类型 **/

报错1:

error: unknown type name ‘g_recdata_callback’
  g_recdata_callback  recdata_callback;    /** 接收数据回调函数指针 **/
  ^~~~~~~~~~~~~~~~~~


错误定义2:

typedef void(*g_recdata_callback)(connect_info_st*, char*, int);    	/** 接收数据回调函数类型 **/

typedef struct _CONNECT_INFO_ST_
{
	int 					port;                 			/** 服务端端口 **/
	char 					ip[32];                			/** 服务端IP **/
	int 					handle;                  		/** 句柄 **/
	int						connect_status;        			/** 连接状态 **/
	g_recdata_callback		recdata_callback;				/** 接收数据回调函数指针 **/
} connect_info_st;

报错2:

error: unknown type name ‘connect_info_st’
 typedef void(*g_recdata_callback)(connect_info_st*, char*, int);
                                   ^~~~~~~~~~~~~~~

error: unknown type name ‘g_recdata_callback’
  g_recdata_callback  recdata_callback;


正确的做法是:在结构体内部定义如上特征的函数指针时,该函数指针成员需要直接使用 struct xxx 作为参数类型。另外,若其他地方还需要使用函数指针,可以在结构体定义的下方再给函数指针取别名。其实这与链表实现的机制是一致的。

正确的定义如下:

typedef struct _CONNECT_INFO_ST_
{
	int 					port;                 						/** 服务端端口 **/
	char 					ip[32];                						/** 服务端IP **/
	int 					handle;                  					/** 句柄 **/
	int						connect_status;        						/** 连接状态 **/
	void(*recdata_callback)(struct _CONNECT_INFO_ST_*, char*, int);		/** 接收数据回调函数指针 **/
} connect_info_st;

typedef void(*g_recdata_callback)(connect_info_st*, char*, int);    	/** 接收数据回调函数类型 **/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半砖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值