2011-03-05 42 views
3

我需要聲明(typedef定義)結構和疼痛老C的(typedef定義)函數引用這是我的代碼:聲明結構和功能的引用,利用對方

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

不要看起來凌亂。差異非常小。 – Jon 2011-03-05 13:29:06

+0

您應該在monitor_calback定義之前(在第二個代碼片段中)添加'struct _monitor_data;'行。 – 2011-03-05 13:32:35

回答

2

您可以定義它之前的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]; 
}; 

這將精細工作,只要你不嘗試引用的monitor_data內部結構struct _monitor_data之前已經完全定義。所有編譯器需要知道的monitor_callback定義是monitor_data *是一個指針,所以monitor_callback是好的,只要編譯器知道monitor_data存在。

這種結構是在C中定義不透明類型的標準方法,你只是不透露你的類型而不是讓它不透明。

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]; 
    }; 
+1

在我看來,這並沒有使代碼更清晰。所以'struct _monitor_data'是最好的選擇。 – 2011-03-05 13:36:26

+0

當然,在「monitor_calback」定義中使用之前,您仍然必須聲明struct _monitor_calback。 – 2011-03-05 13:41:33

+0

不行,這就是要點;它不需要。我使用gcc的鏈接器和原始海報似乎有一個鏈接器,它也是如此。 – 2011-03-05 13:46:04

0

有沒有更好的辦法,因爲typedef行爲。