3

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

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

4

3 回答 3

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_callbackmonitor_data *monitor_callbackmonitor_data

这种构造是在 C 中定义不透明类型的标准方法,您只需使您的类型不透明而不是让它不透明。

于 2011-03-05T16:26:38.897 回答
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];
    };
于 2011-03-05T13:31:47.033 回答
0

typedef由于行为,没有更好的方法。

于 2011-03-05T13:34:22.050 回答