C中的函数指针和指针参数

时间:2011-04-25 03:23:38

标签: c arguments function-pointers

完成C的菜鸟,只是开始一些游手好闲,想知道如何(阅读“ if ”)以下是可能的。

尝试使用作为函数指针的成员创建struct,并且函数指针指向一个函数,该函数接受与前述struct相同类型的参数。例如(注意语法,只是熟悉这里):

typedef struct{
    void (*myStructFunc)(void);
} MyStructType;

void myFunc(void){
    printf("Hello world!");
}

// ...

MyStructType myStruct;
myStruct.myStructFunc = &myFunc;
myStruct.myStructFunc(); // <= Hello world!

这个工作正常,但是当我尝试将MyStructType类型的参数引入函数时:

typedef struct{
    void (*myStructFunc)(*MyStructType); // <= parse error
} MyStructType;

void myFunc(MyStructType *myStruct){
    printf("Hello world!");
}

// ...

MyStructType myStruct;
myStruct.myStructFunc = &myFunc;
myStruct.myStructFunc(&myStruct);

这些例子很简单,原因很明显,但它们说明了我的意图。再一次,只是用C弄湿我的脚,请原谅任何语法上的无知。

无论如何,我怎么能做到这一点?很明显,我在语法上做了一些不正确的事情,或者我正在尝试做一些明显不可能的事情。

另请注意,其原因纯粹是学术性的。

3 个答案:

答案 0 :(得分:5)

在您的第二个示例中,当您声明您的功能时,未定义名称MyStructType。此外,您有*错误的位置。您需要执行类似以下操作:

typedef struct MyStruct {
    void (*myStructFunc)(struct MyStruct *);
} MyStructType;

答案 1 :(得分:2)

解析错误来自*MyStructType,由于您在实际函数定义中正确声明了结构指针,因此这似乎是一个错字。

修复这仍然是一个错误,因为在struct定义时,typedef尚未生效。使用链表可以说明同样的问题(更清楚地是恕我直言):

typedef struct {
  node *next; // error - what is a node?
  void *data;
} node; // this is where node is defined

要解决此问题,您需要使用名为struct

的名称
struct node {
  struct node *next;
  void *data;
};

或先放typedef,然后定义(再次命名)struct

typedef struct node node;

struct node {
  node *next;
  void *data;
};

或者(如果你感到讨厌)只需使用void *指针:

typedef struct {
  void *next;
  void *data;
} node;

这同样适用于您的情况。

答案 2 :(得分:2)

尝试:

struct MyStructType {
  void (*myStructFunc)(struct MyStructType*);
};

代替。在C中,结构体位于它们自己的命名空间中,因此如果要引用结构,则需要在名称前加struct。在您引用之后才会看到typedef,这是一个错误。如果你仍然想要typedef,你可以这样做:

typedef MyStructType MyStructType_t;