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 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 に答える