C语言是否支持泛型编程?

描述

C语言是否支持泛型编程?毫无疑问,答案是不支持。

什么是泛型编程,我觉得用C++里面的模板可以很好的说明。

#include 


//函数模板
template 
void add(T x, T y)
{
    std::cout << x + y << std::endl;
}


int main()
{
    add(1, 2);
    add(1.11f, 2.22f);


    return 0;
}
比如函数add就是一个模板函数,它既能支持整数的相加,也能支持浮点数的相加,甚至是其他的自定义类型,只要能提供相加的规则,编译器都能通过。

泛型编程可以大大的提高编程的效率。

C语言本身并不支持泛型,好在C11标准后,新增了关键字_Generic,它可以支持轻量级的泛型编程。

_Generic的作用,如果用一句话来描述,就是可以获得变量的类型。

大家可以想一下,在C语言里面,好像确实没有什么方法能获得一个变量的类型。

比如int a,用户确实可以知道 a 是 int 类型,但是如果想要通过代码来计算出 a 的类型,好像确实比较麻烦。

_Generic就解决了这个问题,写个简单的代码看下。
#include 


int main()
{
    int a;


    printf("%s
", _Generic((a), int : "int", char : "char"));


    return 0;
}
第一个表达式就是变量a,后面依次跟上可能的类型,如果是int类型,就输出int,如果是char类型,就输出char。

为了看起来简单一些,我这里就写两个。

运行程序,确实输出的就是int。 如果把代码写的完整一些,可以来一个宏定义,然后把常见的类型都写在后面,当然,指针也没有问题。
#include 


#define TYPE_NAME(val) _Generic((val), int : "int", 
                                       char : "char", 
                                       short : "short", 
                                       float : "float", 
                                       double : "double", 
                                       int * : "int *", 
                                       default : "unkown")


int main()
{
    int a;
    char b;
    int *c;
    double d;


    printf("%s
", TYPE_NAME(a));
    printf("%s
", TYPE_NAME(b));
    printf("%s
", TYPE_NAME(c));
    printf("%s
", TYPE_NAME(d));


    return 0;
}
再次运行程序,这样得到的结果就会更丰富一些。

有了这个基础,我们再来看下如何用它实现所谓的泛型编程。

比如还是实现两个数字的相加。

先来两个函数,因为C语言不支持函数重载,所以函数名得不一样,一个叫add_int,一个叫add_float。
int add_int(int a,int b)
{
    printf("%d + %d = %d
",a,b,a+b);
    return a+b;
}


float add_float(float a,float b)
{
    printf("%f + %f = %f
",a,b,a+b);
    return a+b;
}


void unsupport()
{
    printf("unsupport type
");
}
然后来一个宏定义,根据第一个参数的类型来匹配到底调用哪个函数。
#define ADD(x,y) _Generic((x),
    int:add_int(x,y),
    float:add_float(x,y),
    default:unsupport())
主函数里面调用ADD函数,参数既可以是int,也可以是float。
int main()
{
    ADD(1, 2);
    ADD(1.11f, 2.22f);


    return 0;
}
运行程序,确实也能达到C++函数模板的效果。
root@Turbo:test# ./1 
1 + 2 = 3
1.110000 + 2.220000 = 3.330000
root@Turbo:test#
 






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

全部0条评论

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

×
20
完善资料,
赚取积分