C 声明相互使用的结构和函数引用

C 声明相互使用的结构和函数引用,c,function,reference,struct,declare,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];

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

有更好的方法吗?

您可以选择以下方法,具体取决于口味:

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

您可以在定义结构之前定义它:

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];
};
只要在
struct\u monitor\u data
完全定义之前不尝试引用
monitor\u data
的内部结构,这就可以正常工作。对于
monitor\u回调
定义,编译器需要知道的是
monitor\u data*
是指向某个对象的指针,因此只要编译器知道
monitor\u回调
存在,那么
monitor\u回调
就可以了


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

在我看来并不凌乱。差异非常小。您应该添加
struct\u monitor\u数据第二个代码片段中的monitor\u calback
定义之前的行。我认为这并不能使代码更清晰。所以
struct\u monitor\u data
是最好的选择。当然,在
monitor\u calback
定义中使用它之前,您仍然需要声明
struct\u monitor\u calback
。不,这就是重点;这是不必要的。我使用gcc的链接器,原始海报似乎也有一个链接器。