У структуры есть указатель на функцию, которая берет указатель на указанную структуру. - PullRequest
0 голосов
/ 05 мая 2011

Я пытаюсь создать структуру, в которой есть указатель на функцию.Указатель этой функции указывает на функцию, которая принимает указатель на указанную структуру.Это настоящая проблема "курица или яйцо", потому что прототип должен знать о структуре, а структура должна знать о прототипе.Есть ли способ предопределить структуру?Я новичок в C, так что если у кого-то есть понимание, я буду очень признателен.

Спасибо, -devnull

#include <stdio.h>
/* predefine struct person? */
void printInfo(struct person *);

struct person{
char *name;
int age;
const void *pf = printInfo;
};


int main(){

struct person master = {"Master", 23};  
return 0;
}

void printInfo(struct person *p){

printf("Name:\t%s\n", p->name);

}

Ответы [ 3 ]

1 голос
/ 05 мая 2011

Вы можете добавить struct person; перед функцией, но вы не можете назначить функцию в struct person, насколько мне известно,

#include <stdio.h>
struct person;
typedef void (FUNCTYPE)(struct person *);
void printInfo(struct person *);

struct person{
    char *name;
    int age;
    FUNCTYPE *pf;
};


int main(){

struct person master = {"Master", 23, printInfo};
    (master.pf)(&master);
    return 0;
}

void printInfo(struct person *p){
    printf("Name:\t%s\n", p->name);
}

В приведенном выше примере печатается Name: Master

1 голос
/ 05 мая 2011
struct person;

typedef void (*fp)(struct person*);

struct person {
    char * name;
    fp fptr;
};

void afunc( struct person * p ) {
    // stuff
}

int main() {
      struct person p = { "fred", afunc };
}
0 голосов
/ 05 мая 2011

Единственное, что я хотел бы добавить, - это то, что все указатели на структуру имеют одинаковую ширину и выравнивание (6.2.5 / 27 (стандарт C99)), поэтому вам не требуется предварительное определение структуры.

...