我有以下系统函数:
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_yield
的reset
参数?
最佳答案
你不能这样做。严格来说,不同函数类型之间的转换是未定义的行为,尽管一些编译器具有非标准扩展,在某种程度上允许这样做。
此外,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/