我看了,但找不到这个问题的直接参考。我是函数指针(和C)的新手,所以我不知道所有可以做的技巧:)
我有效地获得了一项功能:
void select_comparator(My_Struct *structure, int (*comp)(int x, int y)) {
...
...其中My_Struct
有原型:
typedef struct my_struct {
int (*comp)(int x, int y);
} My_Struct;
模拟一些小细节。我只是想知道以下是否是正确的语法:
void select_comparator(My_Struct *structure, int (*comp)(int x, int y)) {
structure->comp = comp;
}
这似乎太容易了,我很担心。
答案 0 :(得分:3)
没有错:这是c中回调的基础。只需确保函数指针的签名与结构中定义的类型匹配即可。远程棘手的地方是你在大型项目中使用它时,人们忘记检查函数指针是否有效或void
,以及参数等。
/*******************************************************************************
* Preprocessor directives.
******************************************************************************/
#include <stdio.h>
/*******************************************************************************
* Data types.
******************************************************************************/
typedef struct my_struct {
int (*comp)(int x, int y);
} My_Struct;
/*******************************************************************************
* Function prototypes.
******************************************************************************/
int c(int a, int b);
void select_comparator(My_Struct *structure, int (*comp)(int x, int y));
/*******************************************************************************
* Function definitions.
******************************************************************************/
/*----------------------------------------------------------------------------*/
int main(void)
{
My_Struct s;
select_comparator(&s, &c);
s.comp(1, 2);
return 0;
}
/*----------------------------------------------------------------------------*/
void select_comparator(My_Struct *structure, int (*comp)(int x, int y))
{
structure->comp = comp;
}
/*----------------------------------------------------------------------------*/
int c(int a, int b)
{
int ret = 0;
if (a < b) {
ret = (-1);
} else if (a > b) {
ret = 1;
}
return ret;
}
答案 1 :(得分:1)
代码没问题。
虽然注意函数指针在C中具有简单可怕的语法,特别是在传递给函数/从函数返回时。尝试编写类似&#34;函数返回函数指针并将函数指针作为参数&#34;而且你很快就会意识到语法是纯粹的疯狂。
因此,最好使功能指针&#34;排成一行&#34;使用typedef与其他语言一起使用。
您的代码可以这样写:
typedef int comp_t (int x, int y); // typedef a function type
typedef struct {
comp_t* comp; // pointer to such a function type
} My_Struct;
void select_comparator(My_Struct *structure, comp_t* comp) {
structure->comp = comp;
}
现在代码变得更容易阅读,函数指针的行为与任何其他指针非常相似。