-2
#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

4

1 に答える 1

3

2番目と3番目の例ではA、宣言の前(中)に参照しています:

typedef struct{
    int a;
    int (*ptr)(A*); // < the compiler doesn't know A at this point.
} A;

また、3番目の例では、ptrを受け取る関数として宣言していますAが、 を受け取る set_a で代入していますA*が、これも有効ではありません。

次の前に宣言する必要があります。

struct A;
typedef struct A{
    int a;
    int (*ptr)(struct A*);
} A;

最初の例では、F既に存在するものを参照しているので問題ありません。

于 2012-10-14T05:19:49.470 に答える