这是将函数传递给结构的正确方法吗?

时间:2017-07-06 01:49:38

标签: c function-pointers

我看了,但找不到这个问题的直接参考。我是函数指针(和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;
}

这似乎太容易了,我很担心。

2 个答案:

答案 0 :(得分:3)

没有错:这是中回调的基础。只需确保函数指针的签名与结构中定义的类型匹配即可。远程棘手的地方是你在大型项目中使用它时,人们忘记检查函数指针是否有效或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;
}

现在代码变得更容易阅读,函数指针的行为与任何其他指针非常相似。