我有以下代码。我只是想知道代码最后一行的含义。
typedef struct Details
{
int D1;
int D2;
} Sdetails;
typedef struct Variable
{
int Type;
Sdetails i;
}Varialbl3;
typedef XAN_BOOL (*returnfunction)(variabl3* Data);
typedef struct _function
{
returnfunction fr;
}function1;
function1 *f1;
variabl3 v3;
f1->fr(&v3);
最后一行f1-> fr(& v3)表示什么?我不明白这个概念。
答案 0 :(得分:4)
f1
是指向结构的指针。该struct有一个名为fr
的成员,它是一个指向函数的指针。该函数使用指针variabl3
并返回XAN_BOOL
。
因此,f1->fr(&v3)
调用f1->fr
指向的函数,提供v3
的地址作为唯一参数,并忽略返回值。
答案 1 :(得分:2)
它调用fr
函数。
f1
是指向function1
(结构)的指针:
typedef struct _function
{
returnfunction fr;
}function1;
function1
有成员 - 指向函数的指针 - 名为fr
。函数,fr
指针只需一个参数 - variabl3
:
// pointer to function, taking one argument with type
// `variabl3` and returns typedef struct _function
typedef XAN_BOOL (*returnfunction)(variabl3* Data);
因此,f1->fr(&v3)
调用fr
并传递v3
作为参数。返回值为XAN_BOOL
,如typedef。
顺便说一句,如果这是真正的代码 - 这是未定义的行为,因为f1
未初始化。
答案 2 :(得分:1)
f1是指针的一种结构; struct的唯一成员是指向函数的指针。最后一行调用指针在该结构的实例中持有的函数,并将variable3
结构的实例的地址作为函数的参数传递。
答案 3 :(得分:0)
它是一个函数的指针:基本上,你正在调用一个可以在其他地方设置的抽象函数。
你应该有一个真正的功能,如:
XAN_BOOL realFunction(variabl3* pxData) { return (pxData==0); }
然后你可以这样做:f1->fr = realFunction
:你的函数指针指向真实函数。然后,当你调用f1-> fr之后,它将调用realFunction。
这在很多设计模式中被广泛使用:当你想要在监听器/触发器中注册回调时,当你想在纯C中实现面向对象的设计时,当你想要eract到UI时(你附加一个行为到按钮,例如在GTK中。)
希望这有助于,如果有任何不清楚的地方,请在评论中提问,我会编辑。