C语言之_Generic用法实例(九十一)

2024-04-14 06:52

本文主要是介绍C语言之_Generic用法实例(九十一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2._Generic介绍
    • 🌻3.代码实例
      • 🐓3.1 简单的类型选择
      • 🐓3.2 类型转换宏
      • 🐓3.3 泛型函数

🌻1.前言

本篇目的:C语言之_Generic用法实例

🌻2._Generic介绍

  • C语言的_Generic表达式是C11标准引入的一个特性,它提供了一种在编译时基于表达式类型选择函数或值的方法。这种机制与C++中的模板元编程相似,但更为简单和受限。
  • _Generic表达式的基本形式如下:
_Generic(expr, type1: value1, type2: value2, ..., default: default_value)
  • 其中expr是我们要判断的表达式,type1, type2, ...是可能的类型,value1, value2, ...是对应的类型为真时返回的值,default_value是默认返回的值(当没有任何类型匹配时)。
  • _Generic表达式的基本思想是,根据expr的类型,从多个候选值中选择一个。这种选择是在编译时进行的,因此_Generic表达式是一种编译时多态。
  • _Generic表达式可以用于多种场景,比如根据不同的类型选择不同的处理函数,实现类型转换等。它的一个重要特点是,它仅适用于类型,而不是特定的值。因此,我们不能用它来做数值的比较或者复杂的类型检查。此外,__Generic表达式在编译时求值,因此它不能用于运行时类型检查。
  • 在使用_Generic表达式时,我们需要注意的是,它的类型匹配是基于expr的静态类型,而不是它的实际值。这意味着,如果expr是一个指针,那么_Generic表达式将根据指针的类型进行匹配,而不是指针指向的对象的类型。
  • 此外,_Generic表达式的类型匹配是按照它在表达式中的顺序进行的。如果多个类型匹配expr,那么将选择第一个匹配的类型。因此,我们在编写_Generic表达式时,应该将最具体的类型放在前面,将最一般的类型放在后面。
  • _Generic表达式的一个常见用途是实现泛型宏。在C语言中,宏是类型无关的,这意味着我们不能编写一个宏,它可以接受任何类型的参数并正确地进行类型转换。但是,通过使用_Generic表达式,我们可以编写一个宏,它在编译时根据参数的类型选择正确的表达式。
  • 总的来说,_Generic表达式为C语言提供了一种简单的、编译时的类型选择机制。尽管它的功能有限,但在某些情况下,它仍然能够提供便利和代码的清晰度。

🌻3.代码实例

🐓3.1 简单的类型选择

#include <stdio.h>void print_int(int i) {printf("Integer: %d\n", i);
}void print_float(float f) {printf("Float: %f\n", f);
}void print_char(char c) {printf("Char: %c\n", c);
}void generic_print(void *data) {_Generic(data, int: print_int,float: print_float,char: print_char)(data);
}int main() {int i = 42;float f = 3.14f;char c = 'A';generic_print(&i);generic_print(&f);generic_print(&c);return 0;
}

🐓3.2 类型转换宏

#include <stdio.h>#define TO_INT(x) _Generic((x), \int: (x), \float: (int)(x), \default: (int)(x))int main() {int i = 42;float f = 3.14f;char c = 'A';printf("ToInt of i: %d\n", TO_INT(i));printf("ToInt of f: %d\n", TO_INT(f));printf("ToInt of c: %d\n", TO_INT(c));return 0;
}

🐓3.3 泛型函数

#include <stdio.h>#define ADD(x, y) _Generic((x), \int: _Generic((y), \int: (x) + (y), \default: (x) + (int)(y)), \float: _Generic((y), \float: (x) + (y), \default: (x) + (float)(y)), \default: _Generic((y), \default: (int)(x) + (int)(y)) \)int main() {int i = 42;float f = 3.14f;char c = 'A';printf("ADD(i, i): %d\n", ADD(i, i));printf("ADD(f, f): %f\n", ADD(f, f));printf("ADD(i, f): %f\n", ADD(i, f));printf("ADD(c, i): %d\n", ADD(c, i));return 0;
}

这篇关于C语言之_Generic用法实例(九十一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902360

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

SpringBoot UserAgentUtils获取用户浏览器的用法

《SpringBootUserAgentUtils获取用户浏览器的用法》UserAgentUtils是于处理用户代理(User-Agent)字符串的工具类,一般用于解析和处理浏览器、操作系统以及设备... 目录介绍效果图依赖封装客户端工具封装IP工具实体类获取设备信息入库介绍UserAgentUtils

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在