C - 奇怪的原型论证

发布于 2024-12-07 07:58:24 字数 141 浏览 2 评论 0原文

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

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

What's going on in this function prototype? Obviously the void parameter with some sort of typecasting is confusing...

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

四叶草在未来唯美盛开 2024-12-14 07:58:24

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

The second argument to the function my_func is a pointer to a function that returns no value (void), but which takes two arguments, a my_struct pointer and ... and (an invalid) void. The latter should probably be void *arg; you cannot have a variable or argument of type void. As it stands, the code should not compile.

段念尘 2024-12-14 07:58:24

此原型声明了一个返回 int * 的函数 my_func。它有两个参数,第一个是 my_struct * 类型,第二个是奇怪的类型 void (*)(my_struct *, void)。这意味着第二个参数是一个指向返回 void 的函数的指针,它本身有两个参数,一个指向 my_struct 和 void 的指针(我认为这是一个拼写错误,它接受一个void *)。

This prototype declares a function, my_func that returns int *. It takes two arguments, the first being of type my_struct * and the second of the strange type void (*)(my_struct *, void). This means that the second argument is a pointer to a function that returns void and takes 2 arguments itself, a pointer to my_struct and void (I assume that was a typo and it takes a void *).

2024-12-14 07:58:24

这篇小文章解释了如何以螺旋状的方式解析 C 声明。构建过程是相反的。

This little article explains how to parse C declarations in a spiral-like motion. Constructing is done in the reverse.

格子衫的從容 2024-12-14 07:58:24

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

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*) 或其他任何内容。只需投射指针即可。

My suggestion - always try to split declarations into smaller ones - in that case code will be more readable. In this case you could re-write code as:

typedef struct {} my_struct;

typedef void (* m_op_function)(my_struct * v, void * arg);

int * my_func(my_struct * m, m_op_function f);

And as everybody said- it's almost 99,99% typo here regarding second parameter to m_op_function- it is possible void* - so that you can pass any pointer to it - be it (char*), (int*), (my_struct*), or anything else. Simply just cast pointer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文