当前位置: 首页 > news >正文

C/C++ 知识点:typedef 关键字

文章目录

  • 一、typedef 关键字
    • 1、 基本用法
    • 2、常见用法
      • 2.1、为基本数据类型定义别名
      • 2.2、为结构体或联合体定义别名
      • 2.3、为指针类型定义别名
      • 2.4、为复杂模板类型定义别名
    • 3、注意事项
    • 4、总结

前言:

在C++(以及C语言)中,typedef 关键字是一种为现有数据类型定义新名称(别名)的方法。这个特性主要用于简化复杂的数据类型声明,提高代码的可读性和可维护性。通过为数据类型提供更有意义的名称,typedef 使得代码更加直观易懂。

一、typedef 关键字

1、 基本用法

typedef 的基本语法结构如下:

typedef existing_type new_type_name;

这里,existing_type 是已经存在的数据类型,而 new_type_name 是你为这个类型定义的新名称(别名)。

2、常见用法

2.1、为基本数据类型定义别名

假设你经常需要在代码中使用无符号的64位整数,你可以这样定义一个新的类型名称:

typedef unsigned long long ullong;ullong largeNumber = 12345678901234567890ULL;

这样,每当你在代码中使用 ullong 时,就相当于在使用 unsigned long long 类型。

2.2、为结构体或联合体定义别名

在C++中,虽然结构体(struct)和类(class)在语义上有所不同,但它们都可以被 typedef 用来定义别名。然而,自C++11起,推荐使用 using 关键字为类型定义别名,但对于结构体和联合体的别名定义,typedef 仍然被广泛使用。

typedef struct {int x, y;
} Point;Point p1 = {1, 2};

注意: 在C++中定义结构体时,如果不使用 typedef,上面的代码也可以简化为:

struct Point {int x, y;
};Point p1 = {1, 2};

但在C语言中,如果要在不指定 struct 关键字的情况下使用 Point 类型,则必须使用 typedef

2.3、为指针类型定义别名

指针类型的声明可能会变得相当复杂,尤其是当它们指向复杂的结构体或类时。使用 typedef 可以简化这些声明。

typedef char* String;String str = "Hello, World!";// 对于指向函数指针的别名
typedef int (*FuncPtr)(int, int);FuncPtr add = &addIntegers; // 假设addIntegers是一个接收两个int参数并返回int的函数

2.4、为复杂模板类型定义别名

在模板编程中,类型定义可能会变得非常冗长和难以理解。使用 typedef(尽管在C++11及更高版本中推荐使用 using)可以简化这些类型定义。

typedef std::map<std::string, int> StringToIntMap;StringToIntMap ageMap;

3、注意事项

  • 虽然 typedef 在C++中仍然被广泛使用,但在C++11及更高版本中,推荐使用 using 关键字来定义类型别名,因为它提供了更灵活的语法和更好的与模板的集成。
  • 当为结构体或类定义别名时,在C++中直接使用 structclass 关键字通常是更好的选择,除非有特别的理由需要使用 typedef(比如为了与C代码兼容)。

4、总结

通过合理利用 typedef 关键字,你可以使C++代码更加清晰、简洁和易于维护。然而,随着C++语言的发展,using 关键字在类型别名定义方面的优势逐渐显现,因此在学习和使用现代C++时,建议同时掌握这两种方法。

相关文章:

C/C++ 知识点:typedef 关键字

文章目录 一、typedef 关键字1、 基本用法2、常见用法2.1、为基本数据类型定义别名2.2、为结构体或联合体定义别名2.3、为指针类型定义别名2.4、为复杂模板类型定义别名 3、注意事项4、总结 前言&#xff1a; 在C&#xff08;以及C语言&#xff09;中&#xff0c;typedef 关键字…...

【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;进程间通信&#x1f42c;进程间通信目的 &#x1f4da;管道 &#x1f4d5;管道的原理&#x1f427;用fork来共享管道原…...

小团队如何选需求管理软件?8款顶级推荐

本文将分享8款适合小团队的需求管理软件&#xff1a;PingCode、Worktile、Tapd、Teambition、禅道、Asana、Jama Connect、Aha!。 在小团队中管理需求时&#xff0c;寻找合适的软件工具常常让人头疼&#xff0c;不同的需求管理软件提供各种功能&#xff0c;但哪些功能真正适合…...

docker操作入门

1.创建镜像&#xff0c;使用当前文件 docker build -t experience . 2.运行容器 docker run -d -p 8501:8501 --name my-running-app my-python-api docker run -p 8508:8508 experience docker run -p 8508:8508 -p 8509:8509 experience 3.查看容器状态 docker ps docker p…...

简单的射箭小游戏网页源码

简单的射箭小游戏网页源码,对准靶心开启你的射击之旅吧 微信扫码免费获取源码...

Python | Leetcode Python题解之第331题验证二叉树的前序序列化

题目&#xff1a; 题解&#xff1a; class Solution:def isValidSerialization(self, preorder: str) -> bool:pre 1for i in preorder.split(,):if i.isdigit():if pre 0:return Falsepre 1else:if pre 0:return Falsepre - 1return pre 0...

0x3 “护网行动”守之道

一、护网防守目标系统 二、护网防守之利器 通过安全流程控制、安全技术保障、安全工具支撑、安全能力提升四个层次全面构成安全防御体系。 安全技术名称解释 IPS&#xff08;入侵防御系统&#xff09;WAF&#xff08;Web应用防火墙&#xff09;IDS&#xff08;入侵检测系统&a…...

白骑士的Matlab教学高级篇 3.1 高级编程技术

系列目录 上一篇&#xff1a;白骑士的Matlab教学进阶篇 2.5 Simulink 高级编程技术在MATLAB中扮演着至关重要的角色&#xff0c;帮助用户更高效地编写复杂程序、提高代码的可维护性和可读性。本节将介绍面向对象编程、函数句柄与回调函数、错误处理与调试的相关内容。 面向对…...

haproxy简介与用法

一、负载均衡 1.1、概念&#xff1a; 负载均衡SLB&#xff08;Server Load Balancer&#xff09;是一种对流量进行按需分发的服务&#xff0c;通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力&#xff0c;并且可以消除系统中的单点故障&#xff0c;提升应用系统…...

Geoscene Pro的三维

一、场景设置 1.3D视图分为全局场景和局部场景。在Geoscene Pro中&#xff0c;两个场景可以自由切换。 &#xff08;1&#xff09;全局场景有固定的坐标系GCS&#xff08;WGS84、CGCS2000&#xff09;&#xff0c;并在全球比例尺下展示&#xff08;全球范围&#xff09;。可以…...

论文阅读 - Scaling Up k-Clique Densest Subgraph Detection | SIGMOD 2023

1. 论文背景 密集子图发现&#xff08;Densest Subgraph Discovery&#xff09;是图挖掘领域的一个基础研究方向&#xff0c;并且近年来在多个应用领域得到了广泛研究。特别是在生物学、金融学和社交网络分析等领域&#xff0c;密集子图的发现对理解复杂网络结构和行为具有重要…...

前端框架(三件套)

学习网站 HTML 系列教程&#xff08;有广告&#xff09; HTML&#xff08;超文本标记语言&#xff09; | MDN (mozilla.org)&#xff08;英文不太友好&#xff09; 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…...

MemoryCache 缓存 实用

MemoryCache 缓存 实用,相关逻辑代码里已详细注释&#xff0c; 在Java中创建一个单例模式&#xff08;Singleton Pattern&#xff09;的MyMemoryCache类&#xff0c;可以采用多种方法&#xff0c;其中最常见的是使用“饿汉式”和“懒汉式”&#xff08;线程安全和非线程安全&am…...

Java设计模式(命令模式)

定义 将一个请求封装为一个对象&#xff0c;从而让你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;以及支持可撤销的操作。 角色 抽象命令类&#xff08;Command&#xff09;&#xff1a;声明用于执行请求的execute方法&#xff0c;通…...

什么是 CI/CD?

什么是 CI/CD&#xff1f; CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是一种软件开发实践&#xff0c;旨在通过自动化的方式频繁地构建、测试和发布软件。CI/CD 可以显著提高软件交付的速度和质量&#xff0c;使团队能够更快地响应市场变化和…...

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

使用要求 1、用的是google里面的扩展打包成crx文件&#xff0c;所以在使用之前你需要确保自己电脑上有google浏览器&#xff0c;而且google浏览器版本需要在124之上。&#xff08;要注意一下&#xff0c;就是电脑只能有一个Chrome浏览器&#xff09; 2、在win10上用vscode开发…...

【苍穹外卖JAVA项目】第2天:新增员工

在EmployeeMapper.java中插入数据&#xff1a;一、新增员工 1.产品原型 2.接口设计 由于需要提交员工信息&#xff0c;用post请求方式&#xff0c;可以携带json数据 3.设计数据库的employee表 4.设计DTO 数据传输对象&#xff08;DTO&#xff09;&#xff1a;封装前端提交过…...

队列的实现及循环队列

一、队列的概念及结构 队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO&#xff08;Fist In First Out&#xff09;。 入队列&#xff1a;进行插入操作的一端称为队尾。 出队列&#xff1a;进行删除操作的一端称为…...

docker部署zookeeper和kafka

docker部署zookeeper和kafka zookeeperkafkakafka-eagle zookeeper firewall-cmd --zonepublic --add-port2181/tcp --permanent firewall-cmd --reload docker pull zookeeper:3.4.14 docker run -d --name zk -p 2181:2181 zookeeper:3.4.14mkdir -p /root/zookeeper/data m…...

(13)zabbix的监控-1

前言&#xff1a;在上一次的基础上&#xff0c;完成实验。 1、添加一个空模板&#xff0c;方便 2、添加空模板到主机192.168.121.50 client-one里面模板是空的 4、在主机添加监控项和图形 5、自定义监控项&#xff0c;在客户端定义 [rootclient1 ~]# vim /etc/zabbix/zabbix_…...

基于S7-200控制的全方位自动洗车系统设计与实现:包含设计手册、PLC程序、仿真与实际接线全图解

基于S7-200控制的自动洗车系统设计 本设计包括设计说明书&#xff0c;PLC程序&#xff0c;组态仿真&#xff0c;I/O接口&#xff0c;带注释程序pdf版&#xff0c;接线图&#xff0c;控制电路图&#xff0c;主电路图&#xff0c;PLC接线图&#xff0c;顺序功能图。 总体设计系统…...

一键部署GLM-4.6V-Flash-WEB:GitCode镜像真香,省去半天环境搭建时间

一键部署GLM-4.6V-Flash-WEB&#xff1a;GitCode镜像真香&#xff0c;省去半天环境搭建时间 1. 为什么选择GLM-4.6V-Flash-WEB 在多模态大模型快速发展的今天&#xff0c;开发者最头疼的不是模型性能&#xff0c;而是如何快速部署和运行。GLM-4.6V-Flash-WEB作为智谱AI最新开…...

AcousticSense AI优化升级:如何提升识别准确率和响应速度

AcousticSense AI优化升级&#xff1a;如何提升识别准确率和响应速度 1. 从听到看&#xff1a;音频识别的新范式 传统音频识别技术往往受限于特征提取的局限性&#xff0c;而AcousticSense AI开创性地将声音转化为视觉信号进行处理。这套系统通过三个关键步骤实现音频理解&am…...

告别卡顿!用AutoDL云GPU+VS Code远程开发,5分钟搞定深度学习环境搭建

告别卡顿&#xff01;用AutoDL云GPUVS Code远程开发&#xff0c;5分钟搞定深度学习环境搭建 当你在本地运行ResNet50模型时&#xff0c;风扇狂转如直升机起飞&#xff0c;而epoch进度条却像蜗牛爬行——这场景每个深度学习开发者都不陌生。传统本地开发环境面临三大困境&#x…...

Wan2.2-I2V-A14B企业级应用:SpringBoot微服务集成与视频生成API实战

Wan2.2-I2V-A14B企业级应用&#xff1a;SpringBoot微服务集成与视频生成API实战 1. 企业视频内容生产的痛点与机遇 在数字化营销和远程办公成为主流的今天&#xff0c;企业对于视频内容的需求呈现爆发式增长。从产品演示视频到员工培训材料&#xff0c;再到社交媒体营销内容&…...

RMBG-2.0与FastAPI结合:高性能背景移除服务

RMBG-2.0与FastAPI结合&#xff1a;高性能背景移除服务 1. 引言 电商商家每天需要处理大量商品图片&#xff0c;手动抠图不仅耗时耗力&#xff0c;而且效果参差不齐。传统背景移除工具要么精度不够&#xff0c;要么处理速度慢&#xff0c;根本无法满足高并发场景的需求。 现…...

FLUX.1-dev旗舰版多GPU部署:分布式推理加速方案

FLUX.1-dev旗舰版多GPU部署&#xff1a;分布式推理加速方案 1. 引言 想象一下&#xff0c;你正在处理一批高分辨率图像生成任务&#xff0c;单张GPU需要等待数分钟才能完成。随着任务量增加&#xff0c;这种等待变得难以忍受。这就是为什么我们需要多GPU部署方案——将计算负…...

Qt项目实战:借助Valgrind精准定位与修复内存泄漏

1. 为什么Qt开发者需要Valgrind 刚接触Qt开发时&#xff0c;我总以为用了智能指针和Qt自带的内存管理机制就能高枕无忧。直到某个深夜&#xff0c;项目上线前突然崩溃&#xff0c;日志里只有一句"segmentation fault"&#xff0c;我才意识到内存问题有多可怕。那次经…...

Ostrakon-VL-8B图文对话实战:上传厨房照片→提问卫生问题→获取结构化反馈

Ostrakon-VL-8B图文对话实战&#xff1a;上传厨房照片→提问卫生问题→获取结构化反馈 想象一下&#xff0c;你是一家连锁餐厅的卫生督导员&#xff0c;每周要巡查几十家门店的厨房。传统方式是什么&#xff1f;拿着检查表&#xff0c;挨个角落拍照&#xff0c;回到办公室再整…...

别再被JJWT新版坑了!手把手教你从0.12.x降级到0.11.2解决parseClaimsJws报错

JJWT版本降级实战&#xff1a;从0.12.x回退0.11.2解决parseClaimsJws报错指南 最近在Spring Boot项目中整合JWT时&#xff0c;不少开发者反馈升级到JJWT 0.12.x后突然遭遇parseClaimsJws方法消失的编译错误。这个看似简单的API变动背后&#xff0c;其实是JJWT团队对安全架构的重…...