C 声明相互使用的结构和函数引用
我需要在旧C中声明(typedef'd)结构和(typedef'd)函数引用。这是我的代码:C 声明相互使用的结构和函数引用,c,function,reference,struct,declare,C,Function,Reference,Struct,Declare,我需要在旧C中声明(typedef'd)结构和(typedef'd)函数引用。这是我的代码: typedef void (*monitor_calback)(monitor_data*, short int, short int, void*); typedef struct { int port; unsigned char port_state; monitor_calback cb_high[8]; void *cb_high_data[8];
typedef void (*monitor_calback)(monitor_data*, short int, short int, void*);
typedef struct
{
int port;
unsigned char port_state;
monitor_calback cb_high[8];
void *cb_high_data[8];
monitor_calback cb_low[8];
void *cb_low_data[8];
} monitor_data;
但是它当然不会编译,因为我们不知道函数引用声明时的结构
我收到了这个,但看起来有点凌乱,有点难读
struct _monitor_data;
typedef void (*monitor_calback)(struct _monitor_data*, short int, short int, void*);
typedef struct _monitor_data
{
int port;
unsigned char port_state;
monitor_calback cb_high[8];
void *cb_high_data[8];
monitor_calback cb_low[8];
void *cb_low_data[8];
} monitor_data;
有更好的方法吗?您可以选择以下方法,具体取决于口味:
#define monitor_data struct _monitor_data
typedef void (*monitor_calback)(monitor_data*, short int, short int, void*);
typedef struct _monitor_data
{
int port;
unsigned char port_state;
monitor_calback cb_high[8];
void *cb_high_data[8];
monitor_calback cb_low[8];
void *cb_low_data[8];
};
由于
typedef
行为的原因,没有更好的方法了。您可以在定义结构之前定义它:
typedef struct _monitor_data monitor_data;
typedef void (*monitor_calback)(monitor_data*, short int, short int, void*);
struct _monitor_data
{
int port;
unsigned char port_state;
monitor_calback cb_high[8];
void *cb_high_data[8];
monitor_calback cb_low[8];
void *cb_low_data[8];
};
只要在struct\u monitor\u data
完全定义之前不尝试引用monitor\u data
的内部结构,这就可以正常工作。对于monitor\u回调
定义,编译器需要知道的是monitor\u data*
是指向某个对象的指针,因此只要编译器知道monitor\u回调
存在,那么monitor\u回调
就可以了
这种构造是在C中定义不透明类型的标准方法,您只需取消对类型的不透明,而不是使其不透明。在我看来并不凌乱。差异非常小。您应该添加
struct\u monitor\u数据代码>第二个代码片段中的monitor\u calback
定义之前的行。我认为这并不能使代码更清晰。所以struct\u monitor\u data
是最好的选择。当然,在monitor\u calback
定义中使用它之前,您仍然需要声明struct\u monitor\u calback
。不,这就是重点;这是不必要的。我使用gcc的链接器,原始海报似乎也有一个链接器。