C-奇怪的原型参数

C-奇怪的原型参数,c,prototype,void,C,Prototype,Void,这个函数原型中发生了什么?显然,某些类型的类型转换的void参数令人困惑 int *my_func(my_struct *m, void (*m_op)(my_struct *v, void arg)); 函数my_func的第二个参数是指向一个函数的指针,该函数不返回任何值(void),但它接受两个参数,一个my_struct指针和。。。和(无效)void。后者可能是void*arg;不能有类型为void的变量或参数。目前,代码不应编译。函数my_func的第二个参数是指向一个函数的指针,该

这个函数原型中发生了什么?显然,某些类型的类型转换的void参数令人困惑

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

函数
my_func
的第二个参数是指向一个函数的指针,该函数不返回任何值(
void
),但它接受两个参数,一个
my_struct
指针和。。。和(无效)
void
。后者可能是
void*arg
;不能有类型为
void
的变量或参数。目前,代码不应编译。

函数
my_func
的第二个参数是指向一个函数的指针,该函数不返回任何值(
void
),但它包含两个参数,一个
my_struct
指针和。。。和(无效)
void
。后者可能是
void*arg
;不能有类型为
void
的变量或参数。目前,代码不应该编译。

这个原型声明了一个函数,
myfunc
,返回
int*
。它有两个参数,第一个是类型
myu-struct*
,第二个是奇怪类型
void(*)(myu-struct*,void)
。这意味着第二个参数是一个指向函数的指针,该函数返回void并自身带有两个参数,一个指向
myu-struct
void
(我假设这是一个打字错误,它使用
void*
)的指针。这个原型声明了一个函数,
myu-func
,返回
int*
。它有两个参数,第一个是类型
myu-struct*
,第二个是奇怪类型
void(*)(myu-struct*,void)
。这意味着第二个参数是一个指向函数的指针,该函数返回void并且本身有两个参数,一个指向
my_struct
void
(我假设这是一个打字错误,它使用
void*
)的指针。我的建议是——总是尝试将声明拆分为较小的声明——在这种情况下,代码将更具可读性。在这种情况下,您可以将代码重新编写为:

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_函数的第二个参数,这里几乎有99.99%的输入错误,有可能
void*
,所以你可以传递任何指向它的指针,无论是
(char*),(int*),(my_struct*)
,或者其他任何东西。只要简单地抛出指针。

我的建议是——始终尝试将声明拆分为更小的声明——在这种情况下,代码将更具可读性。在这种情况下,您可以将代码重新编写为:

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_函数的第二个参数,这里几乎有99.99%的输入错误,有可能
void*
,所以你可以传递任何指向它的指针,无论是
(char*),(int*),(my_struct*)
,或者其他任何东西。只需转换指针。

解释了如何以螺旋状的方式解析C声明。构造是以相反的方式完成的。

解释了如何以螺旋状的方式解析C声明。构造是反向进行的。

在您最喜欢的C语言书中查找“函数指针”。在您最喜欢的C语言书中查找“函数指针”。