typedef

1 typedef的用法

1.1 typedef的意义

typedef用于定义一种新的类型,这句话是错误的!

typedef的意义:

  • typedef用于给一个已经存在的数据类型重命名。
  • typedef本质上不能产生新的类型。

typedef重命名的类型需要注意:

  • 可以在typedef语句之后定义。
  • 不能被unsigned和signed修饰。

用法: typedef type new_name


2 typedef和#define的区别

2.1 typedef和#define效果等同的情况

首先,我们必须明白#define只是预处理指令,只能进行简单的文本替换;而typedef是给已经存在的类型的进行重命名,用来简化程序的书写以及提高程序的可移植性。另外需要知道,typedef所定义的类型是在编译阶段进行处理的。也就是说,typedef和#define的本质是不一样的。

对于如下代码,typedef和#define可以起到相同的效果:

typedef int int32_t;
#define int32_t int

int32_t a, b;

2.2 typedef和#define效果不等同的情况

如果我们将上面的int类型换成int*类型,那么两者的效果将不再等同,这里需要特别注意:

typedef int* int32_t;

int32_t a, b;
/* 等同于如下代码 */
int *a, *b;
#define int32_t int*

int32_t a, b;
/* 等同于如下代码 */
int* a, b;

3 typedef特殊之处

3.1 typedef特殊之处

如下代码中的p代表什么含义?

typedef int* pInt;
const pInt p;
p = NULL;	// error

我们需要知道pInt对于编译器来说是一个整体,那么就是指p这个变量不能出现在赋值符号的左边。


参考资料:

  1. C语言进阶剖析教程
  2. C/C++从入门到精通-高级程序员之路【奇牛学院】
### typedef 的基本概念 `typedef` 是 C 和 C++ 中用于为已有数据类型创建别名的关键字,其主要作用是提高代码可读性和维护性,尤其在处理复杂类型声明时更为有效[^2]。通过 `typedef` 定义的名称并不是新类型,而是现有类型的同义词。 --- ### 基本语法格式 ```cpp typedef 已有类型名 新类型别名; ``` 该语句将“新类型别名”作为“已有类型名”的别名,在后续代码中可以像使用原始类型一样使用这个别名[^4]。 --- ### 常见用法示例 #### 1. 为基础数据类型定义别名 常用于简化跨平台开发中的类型管理: ```cpp typedef unsigned long ulong; typedef unsigned int uint32_t; typedef char* string_ptr; ulong value = 100UL; // 使用 ulong 替代 unsigned long string_ptr str = "hello"; // str 是指向字符的指针 ``` 这种方式提升了代码简洁度并增强了移植性[^2]。 #### 2. 为结构体定义别名 传统 C 风格下需重复书写 `struct` 关键字,而 `typedef` 可消除冗余: ```cpp typedef struct { int x; int y; } Point; // 此后可以直接使用 Point 而无需 struct 关键字 Point p1 = {1, 2}; Point p2 = {.x = 3, .y = 4}; // 支持指定初始化(C99及以上) ``` 此方法广泛应用于嵌入式编程和图形计算等领域[^2]。 #### 3. 同时定义多个别名(含指针) 可以在一条 `typedef` 语句中为同一基础类型定义多种变体: ```cpp typedef int MyInt, *IntPtr, (&RefToInt)[5]; MyInt i = 10; // 等价于 int i = 10; IntPtr pi = &i; // 等价于 int* pi = &i; int arr[5] = {}; RefToInt ref_arr = arr; // 引用数组(高级用法) ``` 注意:此处 `IntPtr` 成为了 `int*` 的别名,体现了 `typedef` 对复合类型的灵活支持[^5]。 #### 4. 函数指针类型的别名定义 这是 `typedef` 最强大的应用场景之一——封装复杂的函数签名: ```cpp typedef int (*CompareFunc)(const void*, const void*); // 示例回调函数匹配 CompareFunc 类型 int compare_ints(const void* a, const void* b) { return (*(int*)a - *(int*)b); } // qsort 接受 CompareFunc 类型参数 #include <cstdlib> extern "C" void qsort(void* base, size_t num, size_t size, CompareFunc cmp); int numbers[] = {5, 2, 8, 1}; qsort(numbers, 4, sizeof(int), compare_ints); ``` 上述方式极大提高了接口抽象能力与调用安全性[^2]。 #### 5. 结合枚举、联合体使用 ```cpp typedef enum Color { RED, GREEN, BLUE } Color; Color background = RED; typedef union Data { int i; float f; double d; } Data; Data data; data.i = 42; // 当前活跃成员为整数 ``` 此类组合常见于协议解析或硬件寄存器映射场景[^3]。 --- ### 注意事项与陷阱 - **不引入新类型**:`typedef` 创建的是别名而非独立类型,因此不能实现类型安全检查。 - **易混淆的指针别名写法**: ```cpp typedef char* StringPtr; StringPtr s1, s2; // 实际效果等价于 char* s1, s2 → s2 并非指针! ``` 若希望两者均为指针,应分别声明或改用现代风格(如 using 或容器类)。 - **宏替换差异**:相比预处理器指令 `#define`,`typedef` 遵循作用域规则且由编译器解析,更安全可靠[^3]。 --- ### C++ 中替代方案 —— `using` 自 C++11 起推荐使用更具表达力的 `using` 语法代替部分 `typedef` 场景: ```cpp using IntPtr = int*; template<typename T> using Vec = std::vector<T>; Vec<int> vec{1, 2, 3}; // 更清晰地表示模板别名 ``` 尽管如此,`typedef` 在遗留系统和标准库兼容方面仍具重要地位。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值