[英]Declare a Structure and a Function Reference that use Each Other
我需要在痛苦的舊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;
有沒有更好的方法來做到這一點?
您可以在定義結構之前鍵入dede結構:
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 _monitor_data
之前不嘗試引用monitor_data
的內部結構,這將正常工作。 所有的編譯器需要知道你的monitor_callback
定義是monitor_data *
是一個指向東西,所以monitor_callback
是罰款,只要編譯器知道monitor_data
存在。
這種構造是在C中定義不透明類型的標准方法,你只需要取消選擇你的類型而不是讓它變得不透明。
你可能更喜歡以下,取決於口味:
#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
行為沒有更好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.