#include <stdio.h>
typedef struct {int a; int b; int c;} F;
typedef struct{
int a;
int (*ptr)(F*);
} A;
int set_a(F * obj){
obj->a = 1;
}
int main(){
F a;
A b;
b.a = 0;
b.ptr = set_a;
b.ptr(&a);
printf("%d",a.a);
getchar();
}
这似乎是正确的
但为什么
#include <stdio.h>
typedef struct{
int a;
int (*ptr)(A*);
} A;
int set_a(A * obj){
obj->a = 1;
}
int main(){
A a;
a.a = 0;
a.ptr = set_a;
a.ptr(&a);
printf("%d",a.a);
getchar();
}
这是不正确的?和
#include <stdio.h>
typedef struct{
int a;
int (*ptr)(A);
} A;
int set_a(A * obj){
obj->a = 1;
}
int main(){
A a;
a.a = 0;
a.ptr = set_a;
a.ptr(&a);
printf("%d",a.a);
getchar();
}
这是对的吗?
我真的好奇
感谢
Windows 7上Visual Studio 2012上的环境语言C
答案 0 :(得分:3)
在第二和第三个例子中,你在声明之前(期间)引用A
:
typedef struct{
int a;
int (*ptr)(A*); // < the compiler doesn't know A at this point.
} A;
此外,在第3个示例中,您将ptr
声明为接收A
的函数,但随后将其分配给接收A*
的set_a,这也是无效的。
您需要在之前声明:
struct A;
typedef struct A{
int a;
int (*ptr)(struct A*);
} A;
在第一个示例中,您引用已存在的F
,这样就可以了。