指向函数的指针,struct作为参数

时间:2011-08-10 15:21:26

标签: c parameters struct type-conversion function-pointers

今天再次重新输入..

在结构中是指向函数的指针,在这个函数中我希望能够处理来自这个结构的数据,所以指向结构的指针作为参数给出。

演示此问题

#include <stdio.h>
#include <stdlib.h>

struct tMYSTRUCTURE;

typedef struct{
    int myint;
    void (* pCallback)(struct tMYSTRUCTURE *mystructure);
}tMYSTRUCTURE;


void hello(struct tMYSTRUCTURE *mystructure){
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
}

int main(void) {
    tMYSTRUCTURE mystruct;
    mystruct.pCallback = hello;

    mystruct.pCallback(&mystruct);
    return EXIT_SUCCESS;

}

但我得警告

  

.. \ src \ retyping.c:31:5:警告:传递参数1   来自不兼容指针类型的'mystruct.pCallback'   .. \ src \ retyping.c:31:5:注意:预期'struct tMYSTRUCTURE *'但是   参数的类型为'struct tMYSTRUCTURE *'

预期'struct tMYSTRUCTURE *'但是'struct tMYSTRUCTURE *',很有趣!

任何想法如何修复它?

2 个答案:

答案 0 :(得分:5)

问题是typedef结构,然后使用struct关键字和typedef'd名称引起的。正确声明structtypedef可以解决问题。

#include <stdio.h>
#include <stdlib.h>

struct tagMYSTRUCTURE;
typedef struct tagMYSTRUCTURE tMYSTRUCTURE;

struct tagMYSTRUCTURE {
    int myint;
    void (* pCallback)(tMYSTRUCTURE *mystructure);
};


void hello(tMYSTRUCTURE *mystructure){
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
}

int main(void) {
    tMYSTRUCTURE mystruct;
    mystruct.pCallback = hello;

    mystruct.pCallback(&mystruct);
    return EXIT_SUCCESS;

}

答案 1 :(得分:2)

更正后的代码:

#include <stdio.h>
#include <stdlib.h>

struct tMYSTRUCTURE_;

typedef struct tMYSTRUCTURE_ {
  int myint;
  void (* pCallback)(struct tMYSTRUCTURE_ *mystructure);
} tMYSTRUCTURE;


void hello(tMYSTRUCTURE *mystructure){
  puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
}

int main(void) {
  tMYSTRUCTURE mystruct;
  mystruct.pCallback = hello;

  mystruct.pCallback(&mystruct);
  return EXIT_SUCCESS;

}

请注意struct名称与typedef名称之间的差异。是的,你可以使它们相同,但许多人(包括我自己)发现这令人困惑......通常的做法是让它们保持清晰。

不可否认,海湾合作委员会的诊断不仅有点奇怪。