声明使用彼此的结构和函数引用

时间:2011-03-05 13:27:31

标签: c function reference struct declare

我需要在痛苦的旧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;

有没有更好的方法来做到这一点?

3 个答案:

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