2011-02-04 47 views
3

引数と同じ構造体をとる関数の関数ポインタを持つ構造体を作成しようとしています。私は現時点でこれを持っています。同じ引数型の構造体の関数ポインタ

typedef struct sharedData 
{ 
    sem_t* forks; 
    int id; 
    void (*forkFunc)(sharedData*); 
}; 

私は

error: expected ‘)’ before ‘*’ token

のようなエラーを取得し、

warning: no semicolon at end of struct or union 
warning: useless storage class specifier in empty declaration 

よう警告しています私はここで間違って何をやっていますか?

+2

struct sharedData *を代わりに記述しましたか? –

答えて

6

問題は、あなたがstructキーワードを必要としない新しいstructを導入するtypedef structを使用しているとき、あなたはstructの宣言内typedef -ed名前を参照することができないということです。代わりに、構造体のフルネームを使用する必要があります。たとえば:

typedef struct sharedData 
{ 
    sem_t* forks; 
    int id; 
    void (*forkFunc)(struct sharedData*); 
}; 

はまた、あなたのtypedef文は、struct sharedDataを呼び出すことで名前を与えられていないため、現在無効です。次のようにこの問題を解決する一つの方法は、次のようになります。

typedef struct sharedData 
{ 
    sem_t* forks; 
    int id; 
    void (*forkFunc)(struct sharedData*); 
} sharedData; 

、あなたがフルネームstruct sharedDataまたは速記名sharedDataにより、構造体を参照することができます。

+2

最後のアンダースコアを削除します。それはちょうど醜いと無駄です。 structタグとtypedefに同じ名前を使用すると、完全に有効です。 –

+0

@R ..- Cool!私はそれを知らなかった。元の投稿を更新します。 – templatetypedef

関連する問題