如何在 C 中创建一个接受未知类型参数的函数?
假设我有以下代码:
struct test* t1;
t1 = get_t(1);
... 其中 get_t
是:
struct test* get_t(int);
如何重构上述代码并将其放入函数中?像下面这样:
void r1(?* t, ?* (fn*)(int)) {
t = fn(1);
}
/* ... */
struct test* t1;
r1(t1, &get_t);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用
void *param
,一个指向任何东西的指针......在glib中通常用作gpointer
use
void *param
, a pointer to anything ... commonly used in glib asgpointer
我有两个想法:
[1] 将
void
指针传递给变量/对象,并在函数中对其进行类型转换。[2] 将所有数据类型与整数数据类型进行联合,该联合将标识联合中的哪个数据类型变量确实保存实际数据。
void *
传递将此联合作为值或像这样的
。您可以将
FLOAT
和INT
以及其他值定义为唯一值。或者简单地
I have two ideas:
[1] Pass
void
pointer to the variable/object, and type cast it in the function.[2] Make a union of all datatypes along with an integer datatype which will identify which datatype variable in the union does hold the actual data. Pass this union as value or as
void *
Something like this.
You can hash define the
FLOAT
andINT
and others as unique values.Or simply
如果你有 gcc,你可以使用这个类型更安全的版本:
Call as:
(你不需要在函数上使用
&
,它们会自动衰减为指针,就像数组一样)。这会检查t
是否为指针,以及get_t
是否为返回该类型指针的函数。_varp_
从技术上讲是不需要的,但可以使参数求值保持正确的顺序。编辑:
如果你没有 gcc,你仍然可以这样做,但你必须明确提供类型:
Call as:
不太安全,而且更冗余,但仍然相当不错。
If you have gcc, you can use this more typesafe version:
Call as:
(You dont need to use
&
on functions, they decay to pointers automatically, like arrays). This checks thatt
is a pointer, and thatget_t
is a function returning that type of pointer._varp_
is technically unneeded, but keeps the argument evaluation in the right order.Edit:
If you don't have gcc, you can still do this, but you have to provide the type explicitly:
Call as:
not quite as safe, and more redundant, but still fairly good.