簡體   English   中英

聲明使用彼此的結構和函數引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM