当前位置:C++技术网 > 资讯 > 探讨C语言设计一个支持灵活修改参数的实现方案

探讨C语言设计一个支持灵活修改参数的实现方案

更新时间:2017-07-25 16:26:54浏览次数:1+次

    当一个函数可能有多个参数,甚至参数的类型都不一样的时候,我们往往需要一个函数有多个版本。在C++中,我们可以使用类的重载成员函数来实现。然而在C语言中呢?在C语言中,要实现和C++那样的重载成员函数,似乎有点麻烦。但是我们可以退而求其次,只要让一个函数的参数设计的足够灵活,就可以让我们使用一个函数就可以达到高度的复用,不也有重载的意味了嘛。
    我们来观察一组函数:
void dofun(int a,int b)
{
    printf("a:%d,b:%d,a+b=%d\n",a,b,a+b);
}

void dofun2(int a,int b,int c)
{
    printf("a:%d,b:%d,c:%d,a+b+c=%d\n",a,b,c,a+b+c);
}
void dofun3(int a,int b,float c)
{
    printf("a:%d,b:%d,c:%.2f,a+b+c=%.2f\n",a,b,c,a+b+c);
}
    这组函数的调用如下:
dofun(100,1);
dofun2(100,1,300);
dofun3(100,1,30.14);
    这样的函数声明形式,会导致在每使用一种情况的时候,都要重新定义函数。假如你这样定义一个函数:
void DoFun(void * var1,void * var2,void * var3)
{
    int a=*((int*)var1);
    int b=*((int*)var2);
    int c=*((int*)var3);
    ///执行后续的处理
}
    然后调用的时候是这样:
int a=100;
int b=50;
int c=54;
DoFun(&a,&b,&c);
    这样一来,DoFun函数的调用就可以固定为一个用法。在今后函数参数有变的时候,我们可以不修改函数的调用方式,只需要修改传入的参数的类型,然后在DoFun内开头位置对传入的参数进行类型转换,就可以使用了。
    相比于前面几个函数的定义方式而言,在函数调用的时候,不再五花八门了。我们少修改了一个位置。
    在这个例子中,使用void*传参看来并不是很有优势,反而让编程变得稍微复杂了点。毕竟对于新手而言,后一种看起来会难一些。不过习惯了就好了。使用void*传参的好处在于,void*可以传递任何类型的参数。
    你不需要事先知道这个函数声明的时候参数的类型,只是在传入参数时需要传入参数的地址,然后在函数内部按照传入时参数的类型进行逆向类型转换,就得到了正确的类型,然后就可以使用参数了。以后你要是觉得传入的类型参数不合适,想换一个函数类型,可以,只要在传入时换一个类型的变量的地址,再改一下函数内部的逆向参数类型转换就可以了。你不需要在传参时纠结参数的转换问题。在传参时相当于隐藏参数的类型的传参。
    使用void*传参使用的地方很多,在此就不一一列举了。在这里也就是告诉新手们,传参不一定要按照指定的类型传参,只要传入参数的地址,然后通过地址,再按照正确的类型,也是可以获取到参数的数据的。
    这种传参方式是指针传参,效率也很高。如果你的参数数据量大,一般都知道指针传参。而使用void*传参,也就是指针传参,它不仅有常规指针传参的优势,而且可以屏蔽参数类型的差异,在解析类型才真正去转换类型。传递void*指针的方式,可以减少传参时栈的压力。在单片机或嵌入式设备,内存容量有限,很多的参数传递容易操作栈溢出而导致参数数据丢失而出错。
    请你在遇到void*传参时,仔细体会一下void*的好处,对提升编程水平有点帮助哦。