C - 奇怪的原型论证

时间:2011-09-30 16:58:29

标签: c prototype void

这个功能原型发生了什么?显然,带有某种类型转换的void参数令人困惑......

int *my_func(my_struct *m, void (*m_op)(my_struct *v, void arg));

4 个答案:

答案 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_structvoid的指针(我认为这是一个错字,需要{{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声明。构建是相反的。