我需要在痛苦的旧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];
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;
有没有更好的方法来做到这一点?
答案 0 :(得分:2)
您可以在定义结构之前键入结构:
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];
};
只要在完全定义monitor_data
之前不尝试引用struct _monitor_data
的内部结构,这将正常工作。所有编译器需要知道的monitor_callback
定义是monitor_data *
是指向某事物的指针,只要编译器知道monitor_callback
存在就monitor_data
就好了。
这种构造是在C中定义不透明类型的标准方法,你只需要取消选择你的类型而不是让它变得不透明。
答案 1 :(得分:0)
你可能更喜欢以下,取决于口味:
#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];
};
答案 2 :(得分:0)
由于typedef
行为,没有更好的方法。