0

0

C++ typedef和using C++ 类型别名定义新旧对比【语法】

穿越時空

穿越時空

发布时间:2026-01-26 13:28:37

|

250人浏览过

|

来源于php中文网

原创

typedef易错因语法反直觉:先写类型再写别名,但类型可含指针、数组、函数签名等修饰,导致声明形似变量定义;using语法更直观且支持模板别名,是泛化场景唯一选择。

c++ typedef和using c++ 类型别名定义新旧对比【语法】

typedef 为什么容易写错顺序

因为 typedef 的语法是「先写类型再写别名」,但这个「类型」本身可以带修饰(比如指针、数组、函数签名),导致声明看起来像变量定义。比如想给 int* 起别名:typedef int* IntPtr; 是对的,但有人误写成 typedef int IntPtr*; —— 这实际声明了 IntPtrint 类型的指针,但语法上 IntPtr* 并不合法,编译失败。

更典型的是函数指针:typedef void (*Handler)(int); 必须把 (*Handler) 套在中间,稍一挪动括号位置就变成完全不同的含义。这种反直觉的“右左法则”让初学者极易出错。

  • 指针别名:必须把 * 和别名名写在一起(int*typedef int* PInt;),不能拆开
  • 数组别名:typedef int Arr[5]; 表示 Arr 是含 5 个 int 的数组类型,不是指针
  • 函数指针:括号位置决定解析优先级,typedef int (*FuncPtr)(double); 中的 (*FuncPtr) 不可省略或移位

using 在模板场景下不可替代

using 是 C++11 引入的别名声明,语法更接近变量定义:「别名 = 类型」。它最明显的优势是在模板中支持别名模板(alias template),而 typedef 完全做不到。

例如想定义一个通用的容器值类型别名:template using Vec = std::vector;。之后就能写 VecVec<:string> —— 这种带模板参数的别名,typedef 语法根本无法表达。

立即学习C++免费学习笔记(深入)”;

  • typedef std::vector IntVec; 只能绑定具体类型,无法泛化
  • using IntVec = std::vector; 等价但更直观,且为后续升级到模板别名留出路径
  • 若涉及嵌套模板,如 using MapStrInt = std::map<:string int>;using 的可读性明显优于 typedef 写法

using 别名能否用于前置声明

不能。无论是 typedef 还是 using,都只是类型别名,不是新类型,也不参与类型系统中的“不完整类型”处理。它们必须在所引用的原始类型已定义(而非仅声明)后才能使用。

Smodin AI Content Detector
Smodin AI Content Detector

多语种AI内容检测工具

下载

比如你只写了 class Widget;(前置声明),此时写 using WidgetPtr = Widget*; 是合法的——因为指针类型不需要 Widget 完整定义;但写 using WidgetVec = std::vector; 就会报错,因为 std::vector 模板需要 Widget 是完整类型。

  • 别名本身不缓解前置声明限制,该编译不过还是过不去
  • 如果原类型未定义,using X = Y;typedef Y X; 都会触发相同错误:'Y' was not declared in this scope
  • 别名不会延迟类型检查:模板实例化时才真正校验,所以错误可能出现在用到别名的地方,而非定义处

typedef 和 using 在 sizeof 或 decltype 中行为一致吗

完全一致。二者都只是类型别名,不引入新类型,因此 sizeofdecltype、模板参数推导、SFINAE 等所有上下文中,它们和原始类型完全等价。

例如:typedef int MyInt;using MyInt = int; 之后,sizeof(MyInt) 都是 4(在常见平台),std::is_same_v 都为 truedecltype(42) 推导出的类型也和 MyInt 相同。

  • 没有运行时开销,无额外内存或性能影响
  • 调试器中通常显示原始类型名(如显示 int 而非 MyInt),除非调试信息保留了别名符号
  • 唯一实际差异只在代码书写、可读性和模板扩展能力上,语义层面无区别

C++ 类型别名的本质是“换名字”,不是“造类型”。真正容易被忽略的点在于:当你开始写模板别名或需要在头文件中频繁解耦依赖时,using 不是“更现代的写法”,而是唯一可行的选择;而仍用 typedef 的老代码,往往卡在无法泛化的瓶颈里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

108

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

97

2023.09.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

401

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

543

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

53

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

101

2025.10.23

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

0

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.6万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号