2011-03-05 3 views
3

мне нужно объявить (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; 

Есть ли лучшие способы сделать это?

+0

Не выглядит грязным для меня. Разница действительно минимальна. – Jon

+0

Вы должны добавить 'struct _monitor_data;' строку до определения 'monitor_calback' (во втором фрагменте кода). –

ответ

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, вы просто будете непропаковать свой тип, а не оставлять его непрозрачным.

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

По-моему, это не делает код более понятным. Поэтому 'struct _monitor_data' - лучший выбор. –

+0

И, конечно, вам еще нужно объявить 'struct _monitor_calback' перед его использованием в определении' monitor_calback'. –

+0

нет, это точка; это не нужно. Я использую компоновщик gcc, и оригинал плаката, похоже, имеет компоновщик, который делает это также. –

0

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

Смежные вопросы