2011-07-30 13 views
7

構造体がtypedefされた関数プロトタイプを実際にconatinsするので、まだ定義されていない構造体を参照する必要があります。例えば、typedef関数のプロトタイプで、構造体が定義される前に参照しようとしています。

typedef int (MyCallbackFunction)(X * x, void * ctx); 

typedef struct CallbackData { 
    MyCallbackFunction * callback; 
    void * ctx; 
} CallbackData; 

typedef struct X { 
    char a; 
    int b; 
    int c; 
    double d; 

    CallbackData e; 
} X; 

実際にこのコード/ヘッダを書き込むための有効な方法は何

をですか?

答えて

4

だけ前方に関連する型を宣言 - あなたはtypedefでの関数ポインタの一部を行うことができます。

struct X_; 

typedef int (*MyCallbackFunction)(struct X_ * x, void * ctx); 

typedef struct CallbackData_ { 
    MyCallbackFunction callback; 
    void * ctx; 
} CallbackData; 

typedef struct X_ { 
    char a; 
    int b; 
    int c; 
    double d; 

    CallbackData e; 
} X; 
+0

'int callback(X * x、void * ctx)'などのコールバック関数を渡すと、 'X'が' struct X'と違うとコンパイラが苦情を言いますか? –

+0

申し訳ありませんが、私はそれを修正しました - 一般的に 'struct'とそのtypedefに異なる名前を与えて、必要に応じて両方を明白に参照できるようにしたいと思います。編集を参照してください。 –

0

はい、構造体を宣言し、MyCallbackFunctionの宣言で使用することができます。ここでは完全な型である必要はありません。

struct X; 
typedef int (MyCallbackFunction)(struct X * x, void * ctx); 
5

ちょうど前方にあなたのtypedef

typedef struct X X; 
typedef struct CallbackData CallbackData; 

を宣言してから宣言struct秒後。

関連する問題