C++ typedef的用法(新手必看)
typedef 是 C++ 语言中的一种关键字,用于为已存在的数据类型赋予新的名字。
这一机制不是为了提高程序运行效率,的主要目的是简化复杂数据类型的声明,从而使代码更加清晰易懂,便于阅读和维护。
例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:
再例如,我们可以使用 typedef 为复杂的指针类型或容器类型设定更直观的别名,如将 std::vector<int> 定义为 IntVector,这样的命名直接反映了其作为整数向量的用途。
在 C++11 标准引入 using 声明以前,typedef 是定义类型别名的唯一手段,它被广泛应用于为特定平台定义适配的数据类型。
例如,可以定义平台特定的整数大小,如 typedef int int32_t,确保在不同的硬件架构上具有一致的行为和性能。
此外,typedef 在模板编程和处理复杂数据结构时尤为重要,因为它不仅提高了代码的清晰度,还使得程序员能通过语义化的名称来操作类型,极大提升了代码的可读性和可维护性。在深入模板库(如 STL)时,合理运用 typedef 可以有效地管理类型,使得代码结构更加紧凑和高效。
通过这种方式,typedef 成为 C++ 编程中一个不可或缺的工具,帮助开发者在保持代码逻辑清晰的同时,优化了类型的使用和管理。
1) 定义机器无关的类型,有利于程序的通用与移植。
2) 创建易于记忆的类型名:
3) 掩饰复合类型:
1) typedef 声明指针:
2) typedef 不能与其他存储类共用关键字:
这一机制不是为了提高程序运行效率,的主要目的是简化复杂数据类型的声明,从而使代码更加清晰易懂,便于阅读和维护。
例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:
struct stu stu1;struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了:
STU stu1;这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。
再例如,我们可以使用 typedef 为复杂的指针类型或容器类型设定更直观的别名,如将 std::vector<int> 定义为 IntVector,这样的命名直接反映了其作为整数向量的用途。
在 C++11 标准引入 using 声明以前,typedef 是定义类型别名的唯一手段,它被广泛应用于为特定平台定义适配的数据类型。
例如,可以定义平台特定的整数大小,如 typedef int int32_t,确保在不同的硬件架构上具有一致的行为和性能。
此外,typedef 在模板编程和处理复杂数据结构时尤为重要,因为它不仅提高了代码的清晰度,还使得程序员能通过语义化的名称来操作类型,极大提升了代码的可读性和可维护性。在深入模板库(如 STL)时,合理运用 typedef 可以有效地管理类型,使得代码结构更加紧凑和高效。
通过这种方式,typedef 成为 C++ 编程中一个不可或缺的工具,帮助开发者在保持代码逻辑清晰的同时,优化了类型的使用和管理。
C++ typedef的适用场景
typedef 的适用场景如下:1) 定义机器无关的类型,有利于程序的通用与移植。
//对已经存在的类型增加一个类型名,而没有创造新的类型。有时程序会依赖于硬件特性 typedef long double REAL; //在目标机器上可以获得最高的精度 typedef double REAL; //在不支持 long double 的机器上 typedef float REAL; //在连 double 都不支持的机器上
2) 创建易于记忆的类型名:
typedef int size //此声明定义了一个 int 的同义字,名字为 size
3) 掩饰复合类型:
typedef char Line[81];定义一个 typedef 的意思就是给 81 个字符元素的数组起了一个昵称 Line。
C++ typedef的使用陷阱
在使用 typedef 时,注意以下陷阱:1) typedef 声明指针:
typedef char * pstr; const pstr;pstr 的类型会被编译器解释为 char * const(一个指向 char 的常量指针),而不是 const char *(指向常量 char 的指针)。
2) typedef 不能与其他存储类共用关键字:
typedef static int FAST_COUNTER; // 编译报错 typedef volatile char VolatileChar;// 编译正确,为 volatile char 创建了别名typedef 在语法上是一个存储类的关键字(与 auto、extern、mutable、static 等一样),虽然并不真正影响对象的存储特性,但因为它已经占据了存储类关键字的位置,所以在 typedef 声明中不能使用其他存储类关键字。