繁体   English   中英

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

[英]Declare a Structure and a Function Reference that use Each Other

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

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

您可以在定义结构之前键入dede结构:

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 _monitor_data之前不尝试引用monitor_data的内部结构,这将正常工作。 所有的编译器需要知道你的monitor_callback定义是monitor_data *是一个指向东西,所以monitor_callback是罚款,只要编译器知道monitor_data存在。

这种构造是在C中定义不透明类型的标准方法,你只需要取消选择你的​​类型而不是让它变得不透明。

你可能更喜欢以下,取决于口味:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM