2011-08-10 3 views
5

今日のように構造体は、関数へのポインタです、この関数の中で、私はこのような構造のデータを使ってできる仕事になりたいので、構造体へのポインタが指定されていますパラメータとして。私は警告を取得ポインタ、構造では...</p> <p>を再入力して、パラメータもう一度

#include <stdio.h> 
#include <stdlib.h> 

struct tMYSTRUCTURE; 

typedef struct{ 
    int myint; 
    void (* pCallback)(struct tMYSTRUCTURE *mystructure); 
}tMYSTRUCTURE; 


void hello(struct tMYSTRUCTURE *mystructure){ 
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ 
} 

int main(void) { 
    tMYSTRUCTURE mystruct; 
    mystruct.pCallback = hello; 

    mystruct.pCallback(&mystruct); 
    return EXIT_SUCCESS; 

} 

しかし、この問題の

デモ

.. \ SRC \ retyping.c:31:5:警告: の 'my​​struct.pCallback' 引数1を渡します互換性のないポインタ型 から.. \ SRC \ retyping.c:5:31注意:予想される 'ストラクトtMYSTRUCTURE *' しかし 引数は型である

'tMYSTRUCTURE *ストラクト' を

は 'struct tMYSTRUCTURE *'が必要ですが、 'struct tMYSTRUCTURE *'です。

どのように修正するのですか?

+1

あなたのコードには、 'struct tMYSTRUCTURE' **のようなものはありません**、これは不完全な型です。あなたが持っているのは、*匿名の構造体だけです。この構造体も 'tMYSTRUCTURE'にtypedefされています。 http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c/612350#612350を参照してください。 –

答えて

5

問題はtypedef構造をINGの、その後typedef D「の名とともにstructキーワードを使用することによって引き起こされています。 structtypedefの両方を宣言すると、問題が修正されます。

#include <stdio.h> 
#include <stdlib.h> 

struct tagMYSTRUCTURE; 
typedef struct tagMYSTRUCTURE tMYSTRUCTURE; 

struct tagMYSTRUCTURE { 
    int myint; 
    void (* pCallback)(tMYSTRUCTURE *mystructure); 
}; 


void hello(tMYSTRUCTURE *mystructure){ 
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ 
} 

int main(void) { 
    tMYSTRUCTURE mystruct; 
    mystruct.pCallback = hello; 

    mystruct.pCallback(&mystruct); 
    return EXIT_SUCCESS; 

} 
2

修正コード:

#include <stdio.h> 
#include <stdlib.h> 

struct tMYSTRUCTURE_; 

typedef struct tMYSTRUCTURE_ { 
    int myint; 
    void (* pCallback)(struct tMYSTRUCTURE_ *mystructure); 
} tMYSTRUCTURE; 


void hello(tMYSTRUCTURE *mystructure){ 
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ 
} 

int main(void) { 
    tMYSTRUCTURE mystruct; 
    mystruct.pCallback = hello; 

    mystruct.pCallback(&mystruct); 
    return EXIT_SUCCESS; 

} 

struct名とtypedef名の違いに注意してください。はい、あなたはそれらを同じにすることができますが、多くの人々(自分自身を含む)は、混乱していると感じています。

確かに、GCCの診断は少し奇妙なものでした。

関連する問題