2009-04-05 10 views
9

私は引数として関数ポインタをとるC関数を持っています。これはプログラムの最後に呼び出すデストラクタです。ここに私の関数のプロトタイプがあります:C:関数ポインタとtypedef問題

int store_dest(void (*routine)(void *)); 

私はこの関数ポインタを他の情報とともに構造体に格納します。良い構造体を得るために、私はこの関数ポインタにtypedefを持たせたいと思います。ここに私のtypedefがある:

typedef void (*my_destructor)(void *); 

そして、ここでは私の構造体である:

typedef struct my_struct{ 
    my_destructor dest; 
    other_info ... 
} my_struct; 

初期化ステップの間に、私は私の機能に「DEST」フィールドを設定したい、ここでのプロトタイプはこの機能:私は「my_dummy_dest」に私の構造の「DEST」フィールドを設定しようとすると、

void* my_dummy_dest(void* foo); 

問題は(実際には単なる警告ですが、私はそれを抑制したいと思います)が発生します

0123私はちょうどそれらを比較するとき

同じ:「互換性のないポインタ型から割り当て警告」:私は「警告を取得

if (my_struct.dest == &my_dummy_dest) 

:明確なポインタ型の比較をキャストを欠い

my_struct.dest = &my_dummy_dest; 

は私が取得します"

しかし、" dest "フィールドを別のルーチンで設定しても警告は表示されません。なぜ私はそれらの警告があるのか​​分からない。

答えて

11

ダミーデストラクタは、void ポインタを返すよう宣言されていますが、voidではありません。この宣言は、デストラクタ関数ポインタのtypedefと一致しません。

+0

oupsである必要があります。私はそれが愚かなものだったことを知っていました。とにかく感謝します:) – claf

5

のtypedefは次のようになります。

typedef void *(*my_destructor)(void *); 
5

をmy_dummy_testがvoidの代わりにvoid *型 を返すため。 void *を返す場合は、typedefは

typedef void* (*my_destructor)(void *);