前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >震惊!!C语言也能实现泛型编程么?

震惊!!C语言也能实现泛型编程么?

作者头像
芝士就是菜
发布2023-04-20 19:18:12
5430
发布2023-04-20 19:18:12
举报
文章被收录于专栏:芝士就是菜芝士就是菜

今天看到一个有意思的知识点,赶紧记录一下,总所周知,C语言没有泛型,但是C11新增了一种表达式,叫做泛型选择表达式(_Generic),这个是干啥的呢?它的作用是根据表达式的类型选择一个值,让我们来看一看它具体的语法

泛型选择引入

先看一段代码:

代码语言:javascript
复制
int main()
{
 int x = 1;
 double y = 2.0;
 char z = 'c';
 printf("%d\n", _Generic(x, int:0, double : 1, default:3));
 printf("%d\n", _Generic(y, int:0, double : 1, default:3));
 printf("%d\n",_Generic(z, int:0, double : 1, default:3));
 return 0;
}

_Generic是C11关键字,后面的圆括号中包含有多个用逗号分隔的项,第一个项是表达式,后面的每一个项都由一个类型、一个冒号和一个值组成,如double: 1。第一个项的类型匹配哪一个标签,整个表达式的值就是该标签后面的值

运行结果如下:

image.png

可以看到,根据传入的变量的类型,打印的结果也不同,第一个printf的第一项x是int,那么整个表达式的结果为0,第二个printf的第一项是double,表达式的结果就是1,第三个printf打印结果为3是因为char类型没有匹配,走了默认的default,结果为3

其实,这个东西很像switch语句,只是Generic用表达式类型匹配标签,switch用表达式的值匹配标签

与宏定义组合

我们可以看到啊,上边的用法还是比较恶心麻烦的,但是呢,我们可以结合宏定义组合去玩这个东西,这样就会非常的方便

直接看例子:

代码语言:javascript
复制
#define MYTYPE(X) _Generic((X),int:"int", double:"double", default:"other")


int main()
{
 int d = 2;
 printf("%s\n", MYTYPE(d));
 printf("%s\n", MYTYPE(1.0*d));
 printf("%s\n", MYTYPE("string"));

 return 0;
}

运行结果如下:

image.png

与宏定义结合是不是感觉好多了,甚至有点C++泛型编程的感觉了,但是其实还差点。

进阶玩法

_ Generic标签对应的值,可以是整形,也可以是字符串,当然也可以是函数指针。

我们来看一下下边的这段代码。

代码语言:javascript
复制
void PrintInt(int x)
{
 printf("%d\n", x);
}
void PrintDouble(double x)
{
 printf("%lf\n", x);
}
void PrintSting(char* x)
{
 printf("%s\n", x);
}

void PrintOther(void x)
{
 print("类型有点问题\n");
}
#define PRINT(X) _Generic((X),\
 int:PrintInt,\
 double:PrintDouble,\
 const char*:PrintSting,\
 default:PrintOther)(X)


int main()
{ 
 int x = 1;
 int y = 2.0;
 const char* str = "hello _Generic";
 PRINT(x);
 PRINT(y);
 PRINT(str);
 return 0;
}

运行结果如下:

这样是不是和C++的泛型编程很像了呢,是不是挺有意思的,当然还是C++的泛型好用一些。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芝士就是菜 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 泛型选择引入
  • 与宏定义组合
  • 进阶玩法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档