Объявите структуру и ссылку на функцию, которые используют друг друга - PullRequest
3 голосов
/ 05 марта 2011

Мне нужно объявить структуру (typedef'd) и ссылку на функцию (typedef'd) при старом C. Это мой код:

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 ]

2 голосов
/ 05 марта 2011

Вы можете набрать определение структуры перед ее определением:

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 голосов
/ 05 марта 2011

Нет лучшего способа из-за поведения typedef.

0 голосов
/ 05 марта 2011

Вы можете предпочесть следующее, в зависимости от вкуса:

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