简体   繁体   中英

Declare a Structure and a Function Reference that use Each Other

I need to declare a (typedef'd) structure and a (typedef'd) function reference in pain old C. This is my code:

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;

But of course it doen't compile because we don't know about the structure when the function reference is declared.

I have gotten this but it looks kinda messy and is a little hard to read.

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;

Are there any better ways to do this?

You can typedef a struct before defining it:

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

This will work fine as long as you don't try to reference the internal structure of monitor_data before struct _monitor_data is fully defined. All the compiler needs to know for your monitor_callback definition is that monitor_data * is a pointer to something so monitor_callback is fine as long as the compiler knows that monitor_data exists.

This sort of construct is the standard approach for defining opaque types in C, you'd just be un-opaquing your type rather than leaving it opaque.

You could prefer the following, depends on taste tho:

    #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行为没有更好的方法。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM