C语言之typeof用法实例(九十二)

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

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

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

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

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.C语言typeof介绍
    • 🌻3.代码实例
      • 🐓3.1 类型推断
      • 🐓3.2 泛型宏
      • 🐓3.3 泛型函数

🌻1.前言

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

🌻2.C语言typeof介绍

  • C语言的typeof运算符是一个编译时运算符,它用于获取表达式的类型。这个运算符是由GCC扩展引入的,不是标准C语言的一部分。typeof运算符允许我们在编写泛型代码时避免硬编码特定的数据类型,从而提高代码的灵活性和可重用性。
    typeof运算符的基本形式如下:
typeof(expr)
  • 其中expr是任何有效的C语言表达式。typeof运算符将返回expr的类型,这个类型可以用于定义新的变量、函数参数或者作为类型转换的目标类型。
  • typeof运算符的一个主要优点是它提供了类型推断的能力。在标准C语言中,我们必须显式地指定变量的类型,这可能导致代码冗长且难以维护。使用typeof,我们可以让编译器自动推断变量的类型,从而使代码更简洁、更清晰。
  • typeof运算符还可以用于实现泛型编程。泛型编程是一种编程范式,它允许我们编写与数据类型无关的代码。在标准C语言中,实现泛型编程通常需要使用宏或者模板(在C++中)。使用typeof,我们可以直接在C语言中编写泛型代码,而无需依赖于宏或者模板。
  • typeof运算符的另一个优点是它提高了代码的可重用性。在标准C语言中,如果我们想为一个数据类型编写一个函数或者宏,我们必须为每个数据类型编写一个单独的版本。使用typeof,我们可以编写一个单一的函数或者宏,它可以接受任何数据类型,并生成适合这些类型的代码。
  • typeof运算符还可以用于实现类型安全的代码。在标准C语言中,类型转换通常是通过强制类型转换实现的,这可能导致潜在的类型错误。使用typeof,我们可以确保类型转换是安全的,因为编译器会检查转换的类型是否兼容。
  • 需要注意的是,typeof运算符是GCC扩展的一部分,因此它可能在其他编译器中不可用。在编写依赖于typeof的代码时,我们应该确保我们的代码只在支持这个运算符的编译器上运行。
  • 总之,typeof运算符为C语言提供了一种在编译时获取表达式类型的方法。尽管它不是标准C语言的一部分,但它可以在支持GCC扩展的环境中用于编写更灵活、更可重用的代码。通过使用typeof,我们可以编写泛型宏和函数,它们可以接受不同类型的参数,并在编译时生成适合这些类型的代码。

🌻3.代码实例

🐓3.1 类型推断

#include <stdio.h>int main() {int x = 42;char *p = NULL;//v1.0 inttypeof(x) y = x; // y的类型被推断为inttypeof(p) p1 = NULL; // y的类型被推断为intprintf("Type of x is: %zu\n", sizeof(x));printf("p = %p\n", p1);//v2.0 char*char str[64] = "Hello typeof usage";typeof(p) data = str; // y的类型被推断为intprintf("data = %s\n", data);return 0;
}
  • 使用typeof来推断一个表达式的类型,并用这个类型来定义一个新的变量。

🐓3.2 泛型宏

#include <stdio.h>#define SWAP(a, b) do { \typeof(a) tmp = a; \a = b; \b = tmp; \
} while (0)int main() {int a = 1;int b = 2;printf("Before swap: a = %d, b = %d\n", a, b);SWAP(a, b);printf("After swap: a = %d, b = %d\n", a, b);return 0;
}
  • 使用typeof来编写一个泛型宏,它可以交换两个变量的值,而不需要知道它们的类型。

🐓3.3 泛型函数

#include <stdio.h>typeof(min(a, b)) min(typeof(a) a, typeof(b) b) {return a < b ? a : b;
}int main() {int i = 42;float f = 3.14f;printf("Min of i and f: %f\n", min(i, f));return 0;
}
  • 使用typeof来编写一个泛型函数,它可以计算两个数的最小值,并返回这个最小值的类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/616774.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程桌面防火墙是什么?

远程桌面防火墙&#xff0c;是一种针对远程桌面应用的安全防护工具。它可以在保证远程桌面连接的便利性和高效性的对网络连接进行安全性的保护&#xff0c;防止未经授权的访问和潜在的安全风险。 远程桌面防火墙的主要功能是对远程桌面连接进行监控和管理。它通过识别和验证连接…

mysql题目4

tj11&#xff1a; select count(*) 员工总人数 from tb_dept a join tb_employee b on a.deptnob.deptno where a.dname 市场部

【QT+QGIS跨平台编译】099:【QGIS_CORE跨平台编译】—【错误处理:qgscoordinatereferencesystem.cpp编译不通过】

点击查看专栏目录 文章目录 一、错误信息二、原因分析三、错误处理3.1 qgscoordinatereferencesystem_legacy.h3.2 qgscoordinatereferencesystem.cpp一、错误信息 macOS操作系统中,Release环境下编译qgscoordinatereferencesystem.cpp,出现错误,详细信息如下: 二

【大语言模型】应用:10分钟实现搜索引擎

本文利用20Newsgroup这个数据集作为Corpus(语料库)&#xff0c;用户可以通过搜索关键字来进行查询关联度最高的News&#xff0c;实现对文本的搜索引擎&#xff1a; 1. 导入数据集 from sklearn.datasets import fetch_20newsgroupsnewsgroups fetch_20newsgroups()print(fNu…

Matlab与ROS(1/2)---Simulink(二)

0. 简介 在上一章中我们详细介绍了ROS与Matlab链接的基础用法。这一章我们将来学习如何使用Matlab当中的Simulink来完成。Simulink对机器人操作系统(ROS)的支持使我们能够创建与ROS网络一起工作的Simulink模型。ROS是一个通信层&#xff0c;允许机器人系统的不同组件以消息的形…

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人&#xff0c;好在解决了。shit!! 实测1&#xff1a;TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑&#xff0c;我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS …

STM32利用软件I2C通讯读MPU6050的ID号

今天的读ID号是建立在上篇文章中有了底层的I2C通讯的6个基本时序来编写的。首先需要完成的就是MPU6050的初始化函数 然后就是编写 指定地址写函数&#xff1a; 一&#xff1a;开始 二&#xff1a;发送 从机地址读写位&#xff08;1&#xff1a;读 0&#xff1…

005Node.js模块URL的使用

引入 URL 模块 要使用 URL 模块&#xff0c;首先需要在代码中引入它。可以使用以下代码将 URL 模块导入到你的脚本中&#xff1a; const url require(url);实例代码 const urlrequire(url); var apihttp://www.baidu.com?nameshixiaobin&age20; console.log(url.parse(…

单链表经典算法题分析

目录 一、链表的中间节点 1.1 题目 1.2 题解 1.3 收获 二、移除链表元素 2.1 题目 2.2 题解 2.3 收获 2.4递归详解 三、反转链表 3.1 题目 3.2 题解 3.3 解释 四、合并两个有序列表 4.1 题目 4.2 题解 4.3 递归详解 声明&#xff1a;本文所有题目均摘自leetco…

策略模式(知识点)——设计模式学习笔记

文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义&#xff1a;定义一个算法族&#xff0c;并分别封装起来。策略让算法的变化独立于它的客户&#xff08;这样就可在不修改上下文代码或其他策略的情况下…

读所罗门的密码笔记19_治理模式

1. 解决方案 1.1. 全球人工智能的环境错综复杂&#xff0c;它严重依赖于价值观&#xff0c;且关系重大 1.2. 即使是与大家同仇敌忾的问题做斗争&#xff0c;也往往无法在国际社会中取得最佳效果 1.3. OPCW&#xff08;禁止化学武器组织&#xff09;已经帮助限制了化学武器的…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了&#xff0c;需要释放端口或者使用其他端口来建立连接。您可以…