gpt4 book ai didi

c - 在 C 中采用未知类型参数的泛型函数

转载 作者:太空狗 更新时间:2023-10-29 15:39:53 25 4
gpt4 key购买 nike

我正在尝试制作一些函数,采用未知类型参数,以通用地应用函数。

让我们以一个可以为数组的每个元素应用 close(int fd) 的函数为例:

void for_each(void *array[], void (*func)(void *))
{
for (size_t i = 0; array[i] != NULL; ++i)
func(array[i]);
}

如果我想在 close(int fd) 中使用这个函数,我必须像这样创建一个包装函数:

void close_fd(void *fd)
{
close(*(int *)fd);
}

我想将此 for_each 函数与字符串、 float 和其他所有内容一起使用。

  • Isn't there something that could achieve it, without the wrapping part ?
  • I know that C++ have a lot of way to do it, lambdas, templates etc., but is there a good way in C ? A compromise ?

最佳答案

嗯,很明显你想针对不同的数据多次调用一个函数(同一个函数)。但是这些数据是在一个数组中传递的,根据定义,数组是相同类型的多个数据项的存储。所以最后没有特殊的构造来做到这一点,只需在普通 C 中完成:

typedef .... MY_TYPE;

/* define a pointer to represent the type of callback pointer you are using */
typedef void (*callback_ptr)(MY_TYPE param);

/* this is the real callback function you are going to use */
void my_func1(MY_TYPE param){
/* process a single MY_TYPE */
}

void my_funcN(MY_TYPE param) {
/* another process function */
}

/* function to apply the callback to an array of MY_TYPE */
void for_each( MY_TYPE array[], size_t array_sz, callback_ptr f )
{
int i;
for (i = 0; i < array_sz; i++)
f(array[i]);
}

....
MY_TYPE my_array[100] = { ... };
size_t my_array_sz = sizeof my_array / sizeof my_array[0];

for_each(my_array, my_array_sz, my_func1); /* process all by my_func1 */
for_each(my_array, my_array_sz, my_funcN); /* process all by my_funcN */

在非绝对必要时尽量避免使用 void *。可能在早期的设计阶段,您不知道它要处理的实际数据类型,但很明显,一旦您编写了实际的调用语句,就必须放置参数并使用返回值,所以您坚持然后是实际类型....这为您提供了有关如何声明回调指针和流程功能的必要提示。将实际类型放入函数调用中可以让编译器检查正确性,这有助于您避免犯错误。

泛型函数

C 中不支持泛型函数,但如果你想要某种安排,允许你编写函数,其中某些数据类型是泛型的,你可以用宏来模拟它(你必须非常小心地编写宏以工作,但可以实现非常好的近似值)

您可以使用 cpp 宏为每种类型定义不同的函数,如:

函数定义.h

#define FUNC(TYPE)                        \
void my_func_##TYPE( TYPE param ) \
{ \
/* body of function */ \
}

然后在文件范围内包含以下函数:

程序.c

FUNC(int)
FUNC(double)

这将扩展为:

        void my_func_int( int param )     \
{ \
/* body of function */ \
}

void my_func_double( double param ) \
{ \
/* body of function */ \
}

无论如何你都会在参数中进行类型检查。如您所见,您必须在函数名称中使用类型,因为 C 不支持函数重载(具有相同名称和不同参数列表的函数)在这种情况下,my_func_*回调,并且必须定义 for_each_* 函数,编译器才能完全进行类型检查。

关于c - 在 C 中采用未知类型参数的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49984810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com