有如下需求:定义一个结构体,结构体内成员含有函数指针,函数指针的参数中包括了该结构体。
错误定义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); /** 接收数据回调函数类型 **/