c中的回调和c中的指针

Posted

技术标签:

【中文标题】c中的回调和c中的指针【英文标题】:Callbacks in c and pointers in c 【发布时间】:2022-01-10 13:57:57 【问题描述】:

我的任务是创建一个函数,该函数使用 2 个给定的签名通过回调汇总数组和列表元素(int 类型):

typedef void (* callback )( void * ctx , int * value );
void arrayForeach ( void * ctx , callback func , int * arr , int n );

我不知道如何在这里使用函数指针,所以我不知道该怎么做。请帮我写这个简单的代码,解释一下什么是回调。

【问题讨论】:

到底是什么问题?您应该知道如何调用函数(通过函数指针来调用并没有什么不同) 对于数组的每个元素,您应该使用参数ctxvalue 调用函数。 callback 是一个类型(如intdouble)。 callback func 声明参数变量func 的类型为callback。由于它是指向函数的指针,因此您可以像任何其他函数一样调用它,并使用合适的参数:func(some_ctx, pointer_to_some_value) 【参考方案1】:
/*  caller must check if arr[0] to arr[n-1] is a valid array or part of an array */
void arrayForEach(int ctx, callback func, int * arr, int n)

    for (int i = 0; i < n; i++)
    
        func(ctx, &arr[i]); // missed the pointer form
        /* you could also use (*func)(ctx, &arr[i]); */
    

【讨论】:

请不要鼓励cargo cult programming。而且我怀疑像 OP 这样的初学者知道__STD_NO_VLA__ 是什么,如何搜索它,或者static n 在数组声明中的含义,所以它可能会让初学者感到困惑而不是帮助。请花一些时间阅读how to write good answers。 好吧,真的不能在不崩溃的情况下对被调用者进行绑定检查。所以最好发出警告。 函数参数声明为int arr[static n]不是 VLA。 只是一个意见,但是C23会尝试删除K&R C函数定义,所以最好在左边有边界。 我应该使用#if (__STDC_VERSION__ == 199901L)||(__STDC_VERSION__ == 201112L)||(__STDC_VERSION__== 201710L)

以上是关于c中的回调和c中的指针的主要内容,如果未能解决你的问题,请参考以下文章

ctypes给扩展模块中的函数传递回调函数

Rust 中的惯用回调

在 Python/ctypes 中的结构内取消引用 C 函数指针

C语言学习笔记整理

C ++中的延迟执行策略

如何将 C# 中的方法指针传递给 C 库?