【问题标题】:struct has a function pointer to a function that takes a pointer of said struct .. need to predfine?struct 有一个函数指针,指向一个函数,该函数采用所述结构的指针..需要预定义吗?
【发布时间】:2011-05-05 09:01:19
【问题描述】:

我正在尝试创建一个具有函数指针的结构。该函数指针指向一个函数,该函数采用所述结构的指针。这是一个真正的先有鸡还是先有蛋的问题,因为原型需要了解结构,而结构需要了解原型。有没有办法预定义结构?我是 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);

}

【问题讨论】:

    标签: c prototype struct member-function-pointers


    【解决方案1】:
    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 };
    }
    

    【讨论】:

      【解决方案2】:

      您可以在函数前添加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

      【讨论】:

      • @pmg - 有这样一个库,它叫做 libMByD。谢谢:)
      • 非常感谢,但是为什么我需要 typedef 呢?我不能让函数指针声明为:void (*pf)();
      • 因为你想要一个指向函数的指针返回 void,而不是指向 void 的指针。一般来说,如果你想要一个指向函数的指针,你需要定义函数原型,这样你就不会有不兼容的类型,编译器需要知道当你调用一个函数时要做什么,这就是你告诉他什么的方式该函数是否期望作为参数以及它返回什么。
      • 使用typedef是为了避免冗长的不清楚的定义比如void (*pf)(struct master)而不是FUNCTYPE *pf
      • @afulldevnull - 你可以在这里看到一个小教程:devx.com/tips/Tip/13829
      【解决方案3】:

      我唯一要补充的是所有结构指针都具有相同的宽度和对齐方式(6.2.5/27(C99 标准)),因此您实际上不需要结构的前向定义。

      【讨论】:

        猜你喜欢
        • 2020-01-12
        • 2014-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多