哪一个错了?

时间:2012-10-14 05:06:26

标签: c syntax function-pointers grammar

#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

1 个答案:

答案 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,这样就可以了。