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

news2025/6/2 5:25:53

简介: 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 int
  typeof(x) y = x; // y的类型被推断为int
  typeof(p) p1 = NULL; // y的类型被推断为int
  printf("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的类型被推断为int
  printf("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.coloradmin.cn/o/1592890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL-触发器:触发器概述、触发器的创建、查看删除触发器、 触发器的优缺点

触发器 触发器1. 触发器概述2. 触发器的创建2.1 创建触发器语法2.2 代码举例 3. 查看、删除触发器3.1 查看触发器3.2 删除触发器 4. 触发器的优缺点4.1 优点4.2 缺点4.3 注意点 注&#xff1a;此为笔者学习尚硅谷-宋红康MySQL的笔记&#xff0c;其中包含个人的笔记和理解&#…

APIGateway的认证

APIGateway的支持的认证如下&#xff1a; 我们从表格中可以看到&#xff0c;HTTP API 不支持资源策略的功能&#xff0c;另外是通过JWT的方式集成Cognito的。 对于REST API则是没有显示说明支持JWT认证&#xff0c;这个我们可以通过Lambda 自定义的方式来实现。 所以按照这个…

【C Hash Map from Redis】

将Redis源码中的哈希表底层逻辑提取&#xff0c;并进行最小demo级测试将对应文件抽出&#xff0c;通过宏替换等方式保证源码编译通过main.c编写测试demo &#xff0c;注册哈希函数和值比较函数&#xff08;必选项&#xff09; /* Hash Tables Implementation.** This file imp…

ThingsBoard通过服务端获取客户端属性或者共享属性

MQTT基础 客户端 MQTT连接 通过服务端获取属性值 案例 1、首先需要创建整个设备的信息&#xff0c;并复制访问令牌 ​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、通过服务端获取属性值 5、在客户端查看对应的客户端属性或者共享属性的key 6、查看整个…

MySQL之索引失效、覆盖、前缀索引及单列、联合索引详细总结

索引失效 最左前缀法则 如果索引了多列(联合索引)&#xff0c;要遵守最左前缀法则&#xff0c;最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引中的列。如果跳跃某一列&#xff0c;索引将部分失效&#xff08;后面的字段索引失效&#xff09;。 联合索…

Golang(一):基础、数组、map、struct

目录 hello world 变量 常量&#xff0c;iota 函数 init函数和导包过程 指针 defer 数组和动态数组 固定长度数组 遍历数组 动态数组 len 和 cap 截取 切片的追加 map 四种声明方式 遍历map 删除 查看键是否存在 结构体 声明 作为形参 方法 封装 继承…

【PG-1】PostgreSQL体系结构概述

1. PostgreSQL体系结构概述 代码结构 其中&#xff0c;backend是后端核心代码&#xff0c;包括右边的几个dir: access&#xff1a;处理数据访问方法和索引的代码。 bootstrap&#xff1a;数据库初始化相关的代码。 catalog&#xff1a;系统目录&#xff08;如表和索引的元数据…

富文本回显 p 标签?去不掉怎么办?如何解决?

使用前端框架富文本控件上传的上传的数据&#xff0c;回显到文本框时显示<p></p>标签&#xff0c;并且数据库里面的数据也为带有p标签的数据&#xff0c;如何去掉 解决办法 使用正则表达式来讲HTML的内容进行替换更改&#xff0c;在vue中定义方法 //移除HTML标签…

Linux的学习之路:9、冯诺依曼与进程(1)

摘要 本章主要是说一下冯诺依曼体系结构和进程的一部分东西。 目录 摘要 一、冯诺依曼体系结构 二、操作系统的概念 三、设计OS的目的 四、管理 五、进程的基本概念 六、PCB 七、在Linux环境下查看进程 八、使用代码创建进程 九、思维导图 一、冯诺依曼体系结构 如…

pyside6自定义部件库和软件框架的建设记录

自定义的部件库原则上尽量做到前后端分离&#xff0c;接口方便&#xff0c;复制简单。 单选框部件 # encoding: utf-8 ################################################### # 自定义的单选框 #################################################### 对外接口&…

【MYSQL】MySQL整体结构之系统服务

一、系统服务层 学习了MySQL网络连接层后&#xff0c;接下来看看系统服务层&#xff0c;MySQL大多数核心功能都位于这一层&#xff0c;包括客户端SQL请求解析、语义分析、查询优化、缓存以及所有的内置函数&#xff08;例如&#xff1a;日期、时间、统计、加密函数...&#xff…

【Godot4.2】CanvasItem绘图函数全解析 - 9.绘制表格

概述 之前介绍TextLine和TextParagraph的时候&#xff0c;提到了用制表符和设定列宽形式来绘制简易表格&#xff0c;但是很明显&#xff0c;单纯使用此种方式很难获得对表格的精确控制。 所以对于表格绘制问题&#xff0c;我决定单独开坑&#xff0c;单独深入研究。 目前比较…

Steam平台游戏发行流程

Steam平台游戏发行流程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师也是游戏热爱者&#xff0c;经常在steam平台玩各种游戏享受快乐生活。去年幻兽帕鲁以及雾锁王国在年底横空出世&#xff0c;幻兽帕鲁更是在短短一星期取得了非常好的成绩&#xff0c;那么作为游戏…

Redis从入门到精通(十七)多级缓存(二)Lua语言入门、OpenResty集群的安装与使用

文章目录 前言6.4 Lua语法入门6.4.1 初识Lua6.4.2 Hello World6.4.3 变量6.4.3.1 Lua的数据类型6.4.3.2 声明变量 6.4.4 循环6.4.5 函数6.4.6 条件控制 6.5 实现多级缓存6.5.1 安装和启动OpenResty6.5.2 实现ajax请求反向代理至OpenResty集群6.5.2.1 反向代理配置6.5.2.2 OpenR…

古月·ROS2入门21讲——学习笔记(二)常用工具部分15-21讲

上篇&#xff1a;古月ROS2入门21讲——学习笔记&#xff08;一&#xff09;核心概念部分1-14讲-CSDN博客 第十五讲&#xff1a;Launch&#xff1a;多节点启动与配置脚本 到目前为止&#xff0c;每当我们运行一个ROS节点&#xff0c;都需要打开一个新的终端运行一个命令。机器人…

使用ioctl扫描wifi信号获取信号属性的实例(二)

使用工具软件扫描 wifi 信号是一件很平常的事情&#xff0c;在知晓 wifi 密码的前提下&#xff0c;通常我们会尽可能地连接信号质量比较好的 wifi 信号&#xff0c;但是如何通过编程来扫描 wifi 信号并获得这些信号的属性(比如信号强度等)&#xff0c;却鲜有文章提及&#xff0…

第16天:信息打点-CDN绕过业务部署漏洞回链接口探针全网扫描反向邮件

第十六天 本课意义 1.CDN服务对安全影响 2.CDN服务绕过识别手法 一、CDN服务-解释差异识别 1.前置知识&#xff1a; 传统访问&#xff1a;用户访问域名–>解析服务器IP–>访问目标主机普通CDN&#xff1a;用户访问域名–>CDN节点–>真实服务器IP–>访问目标…

C++项目 -- 负载均衡OJ(一)comm

C项目 – 负载均衡OJ&#xff08;一&#xff09;comm 文章目录 C项目 -- 负载均衡OJ&#xff08;一&#xff09;comm一、项目宏观结构1.项目功能2.项目结构 二、comm公共模块1.util.hpp2.log.hpp 一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ&#xff0c;实现类似…

LLM生成模型在生物单细胞single cell的应用:scGPT

参考&#xff1a; https://github.com/bowang-lab/scGPT https://www.youtube.com/watch?vXhwYlgEeQAs 主要是把单细胞测序出来的基因表达量的拼接起来构建成的序列&#xff0c;这里不是用的基因的ATCG&#xff0c;是直接用的基因名称 训练数据&#xff1a;scGPT全人模型是在3…

ARMv8-A架构下的外部debug模型之外部调试事件(external debug events)概述

外部调试器与处理器之间的握手与external debug events 一&#xff0c;External Debug的使能二&#xff0c;外部调试器和CPU之间的握手三&#xff0c;外部调试事件 External debug events1. External debug request event2. Halt instruction debug event3. Halting step debug…