使用C语言实现函数模板

描述

用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?

放在C语言里面,确实比较困难。

我们先来看看C++的解决方案。

 

#include 


template 
T add(T x, T y)
{
    return x + y;
}


int main()
{
    std::cout << add(1, 2) << std::endl;  //显式调用
    std::cout << add(1.1, 2.2) << std::endl;   //隐式调用


    return 0;
}

 

C++有个重要的概念叫做模板,所谓模板,就是通用的意思。

不管是整数的相加,还是浮点数的相加,代码都是一样的,唯一的区别就是类型,参数的类型以及返回值的类型。

那就干脆用一种通用的类型来代替,这个类型暂且就叫 T。

这样的代码如果直接拿来编译,编译器肯定会提示 T 这种类型不能识别,毕竟它不是标准的类型。

所以还需要在上面加一行代码,专门告诉编译器,T 是一种类型。

调用函数的时候,可以显示指定类型,也可以让编译器自己去分析,这就是 C++ 中的函数模板。

单从功能上来说,确实给用户提供了极大的方便。

再回到C语言上,C语言并没有函数模板的概念,唯一能接近函数模板的方式,可能就是使用 _Generic 关键字。

 

#include 


int add_int(int x, int y)
{
    return x + y;
}


double add_double(double x, double y)
{
    return x + y;
}


#define ADD(X, Y) _Generic((X), int : add_int(X, Y),
                                double : add_double(X, Y))
                                
int main()
{
    printf("%d
", ADD(1, 2));
    printf("%lf
", ADD(1.1, 2.2));
    
    return 0;
}

 


 

‑Generic 关键字可以判断参数 x 的类型,根据类型去匹配相应的函数,如果不看这些代码,从使用的角度,确实有点函数模板的意思。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分