今天再次重新输入..
在结构中是指向函数的指针,在这个函数中我希望能够处理来自这个结构的数据,所以指向结构的指针作为参数给出。
演示此问题
#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:警告:传递参数1 来自不兼容指针类型的'mystruct.pCallback' .. \ src \ retyping.c:31:5:注意:预期'struct tMYSTRUCTURE *'但是 参数的类型为'struct tMYSTRUCTURE *'
预期'struct tMYSTRUCTURE *'但是'struct tMYSTRUCTURE *',很有趣!
任何想法如何修复它?
答案 0 :(得分:5)
问题是typedef
结构,然后使用struct
关键字和typedef
'd名称引起的。正确声明struct
和typedef
可以解决问题。
#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;
}
答案 1 :(得分: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
名称之间的差异。是的,你可以使它们相同,但许多人(包括我自己)发现这令人困惑......通常的做法是让它们保持清晰。
不可否认,海湾合作委员会的诊断不仅有点奇怪。