您的位置:首页 >科技 >

C语言中的union语法有什么用

C语言中的结构体语法是非常重要,也是非常有用的,相信看了最近几节的读者应该明白。事实上,在实际的C语言项目开发中,为了代码的简洁性,描述问题时很难离开结构体。

“相同信息”的困扰

“相同信息”的困扰

例如上一节,用于描述视频信息时,可如下定义结构体:

描述视频信息的结构体

这样一来,在C语言代码中只需一个结构体变量就可用于描述视频的名称、地址、时间等信息,而无需定义多个变量,整个代码就显得非常简洁了。更为方便的是,如果今后需要增加对视频的描述,也仅需对 video_info 新增一个成员而已,例如:

video_info

有视频的地方常常也会有音频,所以我们的C语言程序还需要描述音频信息。音频信息也包括名称、地址、时间等信息,不过它也有与视频不同的参数,例如采样率,通道数。所以使用C语言描述音频信息,可以使用下面这个结构体:

C语言程序描述视频和音频就简单了

这样一来,C语言程序描述视频和音频就简单了,只要使用 video_info 和 audio_info 结构体就可以了:

video_info 和 audio_info 结构体

不过,细心的读者应该能够注意到 video_info 和 audio_info 仅个别成员不同,所以似乎可以这样:

似乎可以这样

上述C语言代码将视频和音频的描述结构体合二为一,以后需要描述视频和音频时,都使用 av_info 结构体:

将视频和音频的描述结构体合二为一

不过,这样虽然将 video_info 和 audio_info 的重复代码合并了,但是却也导致代码的耦合性增强:用于描述视频的 vinfo 也能访问音频才有的 chnnl_cnt,用于描述音频的 ainfo 也能访问视频的 alg。

C语言很简单

当然,程序员可以在写C语言代码时限制 vinfo 访问音频成员,限制 ainfo 访问视频成员,但是这样也会带来内存的浪费:使用 vinfo 时,音频成员占用的内存被浪费,使用 ainfo 时,视频成员占用的内存被浪费。

union 语法大显身手

可能有读者认为,视音频共用合并后的 av_info 结构体浪费的内存很小,可以不做考虑。但是应该明白,C语言程序常用语资源比较紧张的嵌入式设备中,因此合格的C语言程序员应该都是“抠门”的,尽可能的节约资源。

那这种情况下,C语言有没有办法,既能避免重复代码,又能避免耦合,同时还能节约资源呢?自然是有的,C语言中的 union 语法就是为此而设计的:

union 语法就是为此而设计的

因为视音频都有名称、地址、大小信息,所以 av_info 中的 name,address,size 成员在描述视频和音频时都会被使用。视音频具有差异的几个成员则使用 union 描述,union 中的 video 和 audio 共用一块内存区域。

video 和 audio 共用一块内存区域

此时访问视频的编码算法和时间信息,可以如下实现:

视频的编码算法和时间信息

访问音频的采样率和通道数,可以如下实现:

访问音频的采样率和通道数

sr = av.audio.sample_rate;cc = av.audio.chnnl_cnt;从上面这几行C语言代码可以看出,此时视音频的相同成员公用,差异成员则通过 union 区分,这就避免了代码重复,也避免了代码耦合。另外,由于union 中的 video 和 audio 共用一块内存空间,内存浪费的问题也解决了。

小结

本节主要讨论了C语言中 union 语法的使用。容易看出,合理的使用 union 语法,可以解决结构体难以解决的问题。

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

关键词: union语法

  • 第二个路由器是设置静态还是动态? 第二个路由器是设置静态还是动态?答:静态或动态都可以。设置第二个路由器上网的时候,第二个路由器的上网方式可以设置成动态IP上网,也可
  • Win11面部识别设置不了怎么办? Win11面部识别不能用怎么办?目前win11系统中部分机型可以支持用户设置面部识别功能,但并非所有设备都兼容该功能,那么Win11面部识别设置不
  • win11怎么关闭触控板? Win11怎么关闭触控板?很多喜欢用笔记本的用户相信自己对笔记本中的触控板已经很熟悉了。可以代替鼠标使用,但是有时候我们的触摸板在连接鼠
  • win11系统卡在暗模式怎么办? 大多数 Windows 用户发现在操作 Windows 系统时使用暗模式主题很舒服。碰巧的是,在使用了几天后,他们可能会在白天使用系统时想将其更
  • 火绒安全如何开启GPU加速? 火绒安全如何开启GPU加速呢?今日为你们带来的文章是火绒安全开启GPU加速的方法,还有不清楚小伙伴和小编一起去学习一下吧。火绒安全开启GPU
  • 骁龙和天玑处理器哪个好 目前大部分智能手机的处理器,用的都是骁龙处理器和天玑处理器。处理器决定了手机的性能和功耗,处理器配置越好的话,使用的流畅度和体验感
  • GPU-Z怎么查看显存频率? GPU-Z怎么查看显存频率呢?今天小编就来讲解GPU-Z查看显存频率的方法,感兴趣的快跟小编一起来看看吧,希望能够帮助到大家。GPU-Z查看显存频
  • 大眼橙NEW X7D怎么样? 家用电视的热度为什么居高不下呢?因为随着人们娱乐方式的丰富,对娱乐设备的要求也越来越高了,很多人开始不满足于用电脑电视追剧看电影,
  • 黑爵K690T PRO怎么样? 在打游戏的时候键盘操作要快捷灵敏,除了手速外键盘性能也很重要,一起来看看这款黑爵K690T PRO机械键盘怎么样吧~黑爵K690T PRO的包装十
  • 支付宝中亲密付和亲情卡有什么不同? 在支付宝上有很多有关亲情支付的卡片,可以为家人们提供各类消费额度,那亲密付和亲情卡的区别有哪些?亲密付和亲情卡的区别亲密付和亲情卡