这个功能原型发生了什么?显然,带有某种类型转换的void参数令人困惑......
int *my_func(my_struct *m, void (*m_op)(my_struct *v, void arg));
答案 0 :(得分:10)
函数my_func
的第二个参数是一个指向函数的指针,该函数不返回任何值(void
),但它带有两个参数,一个my_struct
指针和...... (无效)void
。后者应该是void *arg
;你不能拥有void
类型的变量或参数。就目前而言,代码不应该编译。
答案 1 :(得分:1)
此原型声明了一个返回my_func
的函数int *
。它需要两个参数,第一个是my_struct *
类型,第二个是奇怪类型void (*)(my_struct *, void)
。这意味着第二个参数是一个指向函数的指针,该函数返回void并且本身带有2个参数,指向my_struct
和void
的指针(我认为这是一个错字,需要{{1} })。
答案 2 :(得分:0)
我的建议 - 总是尝试将声明拆分为较小的声明 - 在这种情况下,代码将更具可读性。在这种情况下,您可以将代码重写为:
typedef struct {} my_struct;
typedef void (* m_op_function)(my_struct * v, void * arg);
int * my_func(my_struct * m, m_op_function f);
正如大家所说 - 关于m_op_function的第二个参数,这几乎是99,99%的错误 - 它可能是void*
- 所以你可以传递指向它的任何指针 - 不管是(char*), (int*), (my_struct*)
,还是还要别的吗。只需投射指针。
答案 3 :(得分:0)
This little article解释了如何以螺旋状运动解析C声明。构建是相反的。