C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在C中采用未知类型参数的通用函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试制作一些函数,采用未知类型参数来泛化应用函数.

让我们举一个函数,它可以为数组的每个元素应用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函数与字符串,浮点数和其他一切.

解决方法

好吧,很明显你想要为不同的数据多次调用一个函数(相同的函数).但是这些数据是在一个数组中传递的,根据定义,它是一个存储多个相同类型的数据项.所以最后没有特殊的构造可以做到这一点,只需在普通的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_funcN); /* process all by my_funcN */

当不是绝对必要时,尽量避免使用void *.可能在早期设计阶段,您不知道它将要处理的实际数据类型,但很明显,一旦您编写实际的调用语句,您必须输入参数并使用返回值,因此您坚持然后到实际的类型….这给你提供了如何声明回调指针和进程函数所需的提示.将实际类型放在函数调用中会使编译器检查是否正确,这有助于您避免犯错.

通用功能

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

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

func_def.h

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

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

program.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中采用未知类型参数的通用函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。