c - 如何将 "a pointer to a function with parameters"传递给另一个函数

标签 c

我有以下系统函数:

int sock_yield( void *s, void (*fn)() );

我需要向其传递一个带有 2 个参数的函数:

void reset(char buf,udp_Socket sock) {

    if (-1 == udp_recv(&sock, &buf, sizeof(buf)));

    if(buf=='R')
    {

        printf("\nReceived-> %c",buf);

        forceSoftReset();

        forceWatchdogTimeout();

    }

}

当调用 sock_yield 函数时,我只能传递函数名而不带参数: sock_yield(sock, reset)

如何指定传递给sock_yieldreset参数?

最佳答案

你不能这样做。严格来说,不同函数类型之间的转换是未定义的行为,尽管一些编译器具有非标准扩展,在某种程度上允许这样做。

此外,void (*fn)() 表示函数接受任何参数,这是过时的样式 C,不应使用。

所以必须重写sock_yield函数。如果是想把回调函数作为参数,那从一开始就写得很糟糕。它应该采用一种特定格式的函数指针。例如:

typedef void sock_callback_t (char buf, udp_socket* sock);

int sock_yield(void* s, sock_callback_t* fn); 

或者,您可以编写一些 hack,在函数指针和 uintptr_t 之间进行转换,但这是一个更糟糕的解决方案,只有在您遇到写得不好的 API 时才应该使用。

关于c - 如何将 "a pointer to a function with parameters"传递给另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56355582/

相关文章:

c - 用户尝试停止服务时出现警告窗口

c - 函数返回值与预期不同

c - 如何使用 grep 或 find 查找函数的定义或类名?

c - time(time_t *timer) 在系统中没有时间漂移的情况下给出错误的结果

c - 将数组作为指针传递

C 程序 - 将字符串数组组合到程序中时出错

c - 在双指针中存储字符串时出现问题

c - 为什么这些嵌入式 C 代码的安排表现如此不同?

c++ - 在 fork() 之后关闭监听套接字

C 程序启动参数