完成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
弄湿我的脚,请原谅任何语法上的无知。
无论如何,我怎么能做到这一点?很明显,我在语法上做了一些不正确的事情,或者我正在尝试做一些明显不可能的事情。
另请注意,其原因纯粹是学术性的。
答案 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;