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

define、typedef和using的使用

definetypedefusing 是 C++(以及 C 语言中的 define)中用于定义别名简化复杂类型的三个关键字,但它们各自有着不同的用途和行为。下面将分别对比这三个关键字:

1. #define

  • 定义方式#define 是预处理指令,它在编译之前由预处理器处理,进行 替换掉源代码中文本 的操作。它通常用于定义宏(macro),包括常量、简单的函数宏等,但是它们不是真正的函数或变量定义。
  • 作用范围:全局作用域,除非在特定作用域内使用 #undef 取消定义。
  • 类型安全:不提供类型安全。宏展开是文本替换,不进行类型检查。
  • 示例
#define MAX_SIZE 100
#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))// 使用 #define 创建的常量宏
int numbers[MAX_VALUE];

关于 #define 的用法和注意事项,可以参考这篇文章:宏与函数的对比、内联函数

优点:

  • 可以在编译时替换文本,提高编译速度。
  • 宏可以在编译时计算常量表达式。

缺点:

  • 宏替换没有类型检查,可能导致难以发现的错误。
  • 宏可以影响作用域和调试信息。
  • 宏展开可能导致意外的行为,特别是在宏定义中有条件语句的情况下。

2. typedef

  • 定义方式typedef 用于为现有的类型创建一个新的名字(别名)。它通常用于简化复杂的类型声明。
  • 作用范围:与普通的变量和函数相同,遵循C++的作用域规则。
  • 类型安全:提供类型安全。typedef 声明的新类型是原类型的一个别名,保留了原类型的所有特性。
  • 示例
typedef int Integer;
typedef std::vector<int> IntVector;typedef struct {int x;int y;
} Point;  // 创建结构体的别名 Point// 使用 typedef 定义的类型别名
myInt number = 10;
Point p = {1, 2};

优点:

  • 提高代码的可读性。
  • 使复杂的类型声明变得更简单。

缺点:

  • typedef 不提供类型安全。
  • 在 C++11 之后,using 通常被认为是一个更好的选择。

3. using

  • 定义方式using 关键字在 C++ 中有多种用途,但在这里我们主要讨论其用于类型别名的功能。using 允许在当前作用域中引入另一个作用域中的类型名。
  • 作用范围:与 typedef 类似,但 using 允许更细粒度的控制,比如模板别名和命名空间中的类型别名。
  • 类型安全:同样提供类型安全。
  • 模板别名using 还可以用于定义模板的别名,这是 typedef 所不能做到的。
  • 命名空间中的类型using 可以用来引入命名空间中的类型,而不需要每次都指定完整的命名空间路径。
  • 示例
    using Integer = int;
    using IntVector = std::vector<int>;template<typename T>
    using Vector = std::vector<T>;// 命名空间中的类型别名
    using namespace std::placeholders; // 引入 std::placeholders 命名空间中的所有内容
    // 或者更具体地
    using std::string; // 只引入 std 命名空间中的 string 类型
    

优点:

  • 提供类型安全。
  • 语法更现代、简洁。
  • 可以用于声明模板别名。
  • 支持声明变量模板。

缺点:

  • typedef 相比,using 是 C++ 特有的特性,不适用于 C 语言。

总结

  • #define 是预处理指令,用于文本替换,不提供类型安全。
  • typedefusing 都用于类型别名,提供类型安全。
  • typedef 适用于简单类型别名,而 using 提供更灵活的控制,特别是模板别名和命名空间中的类型别名。
  • 在现代 C++ 代码中,推荐使用 using 代替 typedef,因为 using 语法更清晰,且与模板和命名空间的交互更自然。

相关文章:

define、typedef和using的使用

define、typedef 和 using 是 C&#xff08;以及 C 语言中的 define&#xff09;中用于定义别名或简化复杂类型的三个关键字&#xff0c;但它们各自有着不同的用途和行为。下面将分别对比这三个关键字&#xff1a; 1. #define 定义方式&#xff1a;#define 是预处理指令&…...

vue element时间选择不能超过今天 时间选中长度不能超过7天

背景&#xff1a; 使用elenmet plus 组件实现时间选择&#xff1b;且日期时间选择不能超过今天&#xff1b;连续选中时间的长度范围不能超过7天 效果展示&#xff1a; 实现思路&#xff1a; 一、使用element组件自带的属性和方法&#xff1b; :disabled-date"disabledDate…...

如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用

要将一个一维数组切分成相同等分&#xff0c;你可以使用 Python 的内置功能或者 NumPy 库&#xff08;如果你处理的是数值数据&#xff09;。以下是几种不同的方法&#xff1a; 方法3 pad_sequence 结合dataloader 应该是最佳方案 ### 方法 1: 使用 Python 的内置切片功能 如果…...

Remix 学习 - @remix-run/react 中主要的 hooks

在 remix-run/react 中&#xff0c;有几个常用的 hooks&#xff0c;它们帮助你在 Remix 应用中处理路由、数据加载和其他功能。以下是一些主要的 hooks&#xff1a; useLoaderData: 用于获取从 loader 函数中返回的数据。 通常在组件中调用&#xff0c;以便访问路由加载的数据…...

STL之stack

stack容器 - 先进后出” - stack是堆栈容器&#xff0c;是一种的容器。 - 头文件&#xff1a;#include <stack> stack的push()与pop()方法 stack.push(elem);//往栈头添加元素 stack.pop();//从栈头移除第一个元素 stack<int> stkInt; stkInt.push(1);stkInt…...

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a; 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; →点击获取网络安全资料攻略← 一、自学…...

适合学生党开学买的蓝牙耳机?分享开放式耳机排行榜前十名

学生党开学想买耳机的话&#xff0c;我觉得比较适合入手开放式耳机&#xff0c;因为这类耳机佩戴舒适度高&#xff0c;长时间使用也不会感到不适或疲劳&#xff0c;同时保持耳道干爽透气&#xff0c;更加健康卫生&#xff0c;还能提供自然、开阔的音场&#xff0c;音质表现优秀…...

汽车租赁系统1.0版本

汽车租赁系统1.0版本比较简陋&#xff0c;以后还会有2.0、3.0……就像《我爱发明》里面的一代机器二代机器&#xff0c;三代机器一样&#xff0c;是一个迭代更新的过程&#xff08;最近比较忙&#xff0c;可能会很久&#xff09;&#xff0c;这个1.0版本很简陋&#xff0c;也请…...

DockerDocker Compose安装(离线+在线)

Docker&Docker Compose安装(离线在线) Docker离线安装 下载想要安装的docker软件版本&#xff1a;https://download.docker.com/linux/static/stable/x86_64/ 如目标机无法从链接下载&#xff0c;可以在本机下载后 scp docker版本压缩包[如docker-20.10.9.tgz] usernameh…...

【泰克生物】酵母展示建库技术解析:构建高质量抗体文库的实用指南

酵母展示库是抗体酵母展示服务的核心组成部分。酵母展示技术利用酵母细胞表面的展示系统&#xff0c;将目标蛋白质&#xff08;如抗体&#xff09;展示在细胞膜上。这一过程首先涉及到将抗体基因克隆到酵母表达载体中。随后&#xff0c;表达载体被转化到酵母细胞中&#xff0c;…...

QT Mode/View之View

目录 概念 使用已存在的视图 使用模型 使用模型的多个视图 处理元素的选择 视图间共享选择 概念 在模型/视图架构中&#xff0c;视图从模型中获取数据项并将它们呈现给用户。数据的表示方式不必与模型提供的数据表示形式相似&#xff0c;而且可能与用于存储数据项的底层数…...

URP 线性空间 ui资源制作规范

前言&#xff1a; 关于颜色空间的介绍&#xff0c;可参阅 unity 文档 Color space URP实现了基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui资源在unity中进行透明度混合时&#xff…...

如何精确统计Pytorch模型推理时间

文章目录 0 背景1 精确统计方法2 手动synchronize和Event适用场景 0 背景 在分析模型性能时需要精确地统计出模型的推理时间&#xff0c;但仅仅通过在模型推理前后打时间戳然后相减得到的时间其实是Host侧向Device侧下发指令的时间。如下图所示&#xff0c;Host侧下发指令与De…...

Mybatis-plus-Generator 3.5.5 自定义模板支持 (DTO/VO 等) 配置

随着项目节奏越来越快&#xff0c;为了减少把时间浪费在新建DTO 、VO 等地方&#xff0c;直接直接基于Mybatis-plus 这颗大树稍微扩展一下&#xff0c;在原来生成PO、 DAO、Service、ServiceImpl、Controller 基础新增。为了解决这个问题&#xff0c;网上找了一堆资料&#xff…...

C#环境下MAC地址获取方法解析

在C#中&#xff0c;获取MAC地址并不是直接支持的&#xff0c;因为出于安全和隐私的考虑&#xff0c;操作系统通常会限制对这类硬件信息的直接访问。不过&#xff0c;仍然可以通过一些方法间接地获取到本地网络接口&#xff08;比如以太网接口&#xff09;的MAC地址。 以下是几…...

(k8s)Kubernetes 从0到1容器编排之旅

一、引言 在当今数字化的浪潮中&#xff0c;Kubernetes 如同一艘强大的航船&#xff0c;引领着容器化应用的部署与管理。它以其卓越的灵活性、可扩展性和可靠性&#xff0c;成为众多企业和开发者的首选。然而&#xff0c;要真正发挥 Kubernetes 的强大威力&#xff0c;仅仅掌握…...

Rust Web开发框架对比:Warp与Actix-web

文章目录 Rust Web开发框架对比&#xff1a;Warp与Actix-web引言框架概述Warp框架简介Actix-web框架简介 设计理念Warp的设计理念Actix-web的设计理念 性能比较可扩展性和生态插件和中间件支持社区和文档 使用示例使用Warp构建简单的HTTP服务使用Actix-web构建简单的HTTP服务 学…...

F12抓包12:Performance(性能)前端性能分析

课程大纲 使用场景: ① 前端界面加载性能测试。 ② 导出性能报告给前端开发。 复习&#xff1a;后端(接口)性能分析 ① 所有请求耗时时间轴&#xff1a;“网络”&#xff08;Network&#xff09; - 概览。 ② 单个请求耗时&#xff1a;“网络”&#xff08;Network&#xf…...

数据结构(Day13)

一、学习内容 内存空间划分 1、一个进程启动后&#xff0c;计算机会给该进程分配4G的虚拟内存 2、其中0G-3G是用户空间【程序员写代码操作部分】【应用层】 3、3G-4G是内核空间【与底层驱动有关】 4、所有进程共享3G-4G的内核空间&#xff0c;每个进程独立拥有0G-3G的用户空间 …...

链表的快速排序(C/C++实现)

一、前言 大家在做需要排名的项目的时候&#xff0c;需要把各种数据从高到低排序。如果用的快速排序的话&#xff0c;处理数组是十分简单的。因为数组的存储空间的连续的&#xff0c;可以通过下标就可以简单的实现。但如果是链表的话&#xff0c;内存地址是随机分配的&#xf…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...