typedef与using
在 C/C++ 中,typedef 是用于为现有数据类型创建别名的关键字,可以把一切合法的变量名的定义转变为类型,它的核心作用是简化复杂类型的使用,提升代码的可读性和可维护性。
typedef 与 C++11 引入的 using 关键字相比,核心功能均为创建类型别名,但 using 在灵活性和语法直观性上更具优势。
什么是类型别名?
typedef(C/C++ 通用)和 using(C++11 起)均用于为现有数据类型定义别名,而非创建新类型。它们的核心价值在于:
- 简化复杂类型(如函数指针、模板类型)的声明;
- 提升代码可读性(用语义化别名替代晦涩类型);
- 增强可维护性(跨平台或底层类型变更时,只需修改别名定义)。
基础语法与核心特性
typedef 是 C 语言继承而来的关键字,在 C++ 中仍被广泛使用,尤其适用于简单场景和旧代码维护。基本语法为:typedef 原类型名 新类型名;
1 | typedef unsigned int UINT; |
- 类型别名的本质:
typedef并未创建新类型,只是为现有类型定义了一个同义词。例如,uint32_t和unsigned int在编译器中视为同一类型,可互相赋值。 - 作用域规则:
typedef可在全局、函数或类作用域中声明。若在函数内部声明,别名仅在该函数内有效。 - 与存储类说明符的冲突:
typedef本身不是存储类说明符(如static或extern),因此不能与它们同时使用。
using 是 C++11 引入的新语法,格式更直观,且天然支持模板别名
| 特性 | typedef |
using |
|---|---|---|
| 语法形式 | typedef 原类型 新类型; |
using 新类型 = 原类型; |
| 模板别名支持 | 不直接支持,需通过类模板实现 | 直接支持,语法更简洁 |
| 函数指针定义 | 需复杂语法包裹 | 更直观,接近函数声明格式 |
模板别名示例
1 | // using 直接定义模板别名 |
using 定义的模板别名支持类模板参数推导(CTAD),进一步简化代码:
1 | using Vec = std::vector<int>; |
using语法更加直观
函数指针:
using定义函数指针时,无需像typedef那样用括号包裹,更接近正常函数声明:1
2
3
4// using 版本(直观)
using CompareFunc = bool (const std::string&, const std::string&);
// typedef 版本(需括号)
typedef bool (*CompareFunc)(const std::string&, const std::string&);嵌套类型:在类或命名空间中定义别名时,
using语法更清晰:1
2
3
4class MyClass {
public:
using ValueType = int; // 嵌套别名,外部可通过 MyClass::ValueType 访问
};
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 山川不念旧!
评论



